Spring: 如何从 RestTemplate 获取根 Url

Spring: how to get rootUri from RestTempalte

我正在使用此配置 class 来初始化 RestTemplate:

@Configuration
public class RestTemplateConfig {

  @Value("${endpoint-url}")
  private String endpointUrl;

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
        .rootUri(endpointUrl)
        .messageConverters(new MappingJackson2HttpMessageConverter())
        .build();
  }
}

在我的服务方法之一中,我使用代码:

RootUriTemplateHandler handler = (RootUriTemplateHandler) restTemplate.getUriTemplateHandler();
String uri = handler.getRootUri();
restTemplate.postForLocation(uri, request);

获取这个URI。是否有更简单的方法来获取此 rootUri(无需强制转换)?还是直接向rootUri执行post请求?

听起来您正试图使用​​ RestTemplate 传递 ${endpoint-url} 的值。看起来有点笨拙的演员阵容有效,但您或许可以考虑以下替代方案之一:

  • 创建一个封装 endpointUrl 和您的 restTemplate 的提供程序,并在需要 endpointUrlrestTemplate 的任何地方注入此提供程序。例如:

    @Component
    public class RestTemplateProvider {
    
        @Value("${endpoint-url}")
        private String endpointUrl;
    
        private final RestTemplate restTemplate;
    
        @Autowired
        public RestTemplateProvider(RestTemplateBuilder restTemplateBuilder) {
            this.restTemplate = restTemplateBuilder.rootUri(endpointUrl)
                    .messageConverters(new MappingJackson2HttpMessageConverter())
                    .build();
        }
    
        public RestTemplate provide() {
            return restTemplate;
        }
    
        public String getEndpointUrl() {
            return endpointUrl;
        }
    }
    
  • @Value("${endpoint-url}") private String endpointUrl; 注入服务 class 需要它的地方。

您可以直接对rootUri 执行post 请求,只要您提供给restTemplate.postForLocation 的uri 以“/”开头即可。在这种情况下,Spring 将自动添加 restTemplate 构造函数中提供的 baseURI。

@Configuration
public class RestTemplateConfig {

   @Bean
   public RestTemplate restTemplate(RestTemplateBuilder builder,
                                    @Value("${endpoint-url}") String endpointUrl) {
     return builder
       .rootUri(endpointUrl)
       .messageConverters(new MappingJackson2HttpMessageConverter())
       .build();
   }
}

在您的服务方法中:

// Make a POST call to ${endpoint-url}/foobar

String uri = "/foobar"; // The leading "/" is important!
restTemplate.postForLocation(uri, request);

restTemplate.getUriTemplateHandler().展开("/")