Java 注入UriComponentsBuilder还是使用静态ServletUriComponentsBuilder?
如果我将Java 注入UriComponentsBuilder还是使用静态ServletUriComponentsBuilder?,java,spring,spring-mvc,Java,Spring,Spring Mvc,如果我将UriComponentsBuilder作为参数注入@RestController方法,或者如果我从静态ServletUriComponentsBuilder上下文访问uri(从下面的RequestContextHolder获取它),会有什么区别吗 @RestController 公共类MyServlet{ @GetMapping 公共列表人员(UriComponentsBuilder uri){ System.out.println(uri.build().toUriString())
UriComponentsBuilder
作为参数注入@RestController
方法,或者如果我从静态ServletUriComponentsBuilder
上下文访问uri(从下面的RequestContextHolder
获取它),会有什么区别吗
@RestController
公共类MyServlet{
@GetMapping
公共列表人员(UriComponentsBuilder uri){
System.out.println(uri.build().toUriString());
System.out.println(ServletUriComponentsBuilder.fromCurrentContextPath().toUriString());
}
}
Spring在后台调用的静态工厂方法是从ServletMapping
public static ServletUriComponentsBuilder fromServletMapping(HttpServletRequest request) {
ServletUriComponentsBuilder builder = fromContextPath(request);
if (StringUtils.hasText(UrlPathHelper.defaultInstance.getPathWithinServletMapping(request))) {
builder.path(request.getServletPath());
}
return builder;
}
下面是您调用的fromContextPath
静态工厂方法的代码:(实际上fromCurrentContextPath
方法使用当前请求调用此方法)
因此,当您有一个包含servlet映射的请求时,您可以看到它们的结果是不同的:在大多数Spring应用程序中,我们只有一个servlet,而这两个servlet的输出是相同的
但是,如果我们的请求属于具有servlet路径:first/
的servlet,该怎么办
想象一下下面的控制器:
@RestController
public class MyServlet {
@GetMapping("test")
public void persons(UriComponentsBuilder uri) {
System.out.println(
uri.path("/second/third").build().toUriString());
System.out.println(
ServletUriComponentsBuilder.fromCurrentContextPath().path("/second/third").build().toUriString());
}
}
当您将请求发送到此路径时,您的输出将如下所示:
http://localhost:8081/first/second/third
http://localhost:8081/second/third
因此,第一个包含servlet路径,但第二个忽略它
要获得相同的结果,可以使用fromCurrentServletMapping
static fatory方法
public static ServletUriComponentsBuilder fromContextPath(HttpServletRequest request) {
ServletUriComponentsBuilder builder = initFromRequest(request);
builder.replacePath(request.getContextPath());
return builder;
}
@RestController
public class MyServlet {
@GetMapping("test")
public void persons(UriComponentsBuilder uri) {
System.out.println(
uri.path("/second/third").build().toUriString());
System.out.println(
ServletUriComponentsBuilder.fromCurrentContextPath().path("/second/third").build().toUriString());
}
}