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());
    }
}