web-dev-qa-db-ja.com

Spring RestTemplateを使用したRESTクライアントのベストプラクティス

REST client in Java SPRINGを使用してBeanを管理するWebアプリケーションを実装することに関するチュートリアルをいくつか読みました。

私が見つけたすべての例は、RESTリクエストを行うたびに新しいRestTemplateを作成します。

通常、WebアプリケーションはシングルトンSpring Beanを使用します。

だから、SpringでRestTemplateを使用するベストプラクティスは何ですか?
シングルトンRestTemplateを使用しますか?
リクエストごとにRestTemplateを作成します。 ?

すべての状況を助言し、説明してください。

10
Chamly Idunil

これを行う最良の方法の1つは、RestTemplateを返すBeanを作成してから、必要なクラスにAutowireすることです。

このようなもの。

_@Configuration
public class ProductServiceConfig {

    @Value("${product.username}")
    private String productServiceUsername;

    @Value("${product.password}")
    private String productServicePassword;

    @Bean(name = "restTemplateForProductService")
    public RestTemplate prepareRestTemplateForProductService() {

        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(productServiceUsername, productServicePassword));

        RequestConfig.Builder requestBuilder = RequestConfig.custom();
        requestBuilder = requestBuilder.setConnectTimeout(1000);

        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
        httpClientBuilder.setDefaultRequestConfig(requestBuilder.build());
        CloseableHttpClient httpClient = httpClientBuilder.build();

        HttpComponentsClientHttpRequestFactory rf = new HttpComponentsClientHttpRequestFactory(httpClient);

        return new RestTemplate(rf);
    }
}
_

このように、タイムアウトや資格情報など、残りの呼び出しに必要なさまざまなパラメーターを設定できます。使用したい場合は、

_@Autowired
RestTemplate restTemplateForProductService;

restTemplateForProductService.......
_

new RestTemplate ()を使用することのもう1つの利点は、RESTを介して異なるサービスを呼び出す必要がある場合、RestTemplatesを返す複数のBean(異なる構成)を定義し、名前を使用して自動配線できることです

12
pvpkiran

RestTemplateを使用する場合は、次のいずれかの方法を使用する必要があります。

静的インスタンス:

/**
 * Rest template client
 */
private static final RestTemplate TEMPLATE = new RestTemplate(new RestClientRequestFactory());


static{
    //Set your options here
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.featuresToEnable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID);

    builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    builder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(builder.build());

    TEMPLATE.setMessageConverters(Arrays.asList(jsonMessageConverter));
}

または、@ ConfigurationクラスでSpring Beanを削除します。

@Bean
public RestTemplate restTemplate(){
    RestTemplate template = new RestTemplate(new RestClientRequestFactory())
            //customize
    return template;
}

RestTemplateクラスを見ると、デフォルトのコンストラクタを何度も押すことを避けたいと思います。

public RestTemplate() {
    this.messageConverters = new ArrayList();
    this.errorHandler = new DefaultResponseErrorHandler();
    this.uriTemplateHandler = new DefaultUriTemplateHandler();
    this.headersExtractor = new RestTemplate.HeadersExtractor();
    this.messageConverters.add(new ByteArrayHttpMessageConverter());
    this.messageConverters.add(new StringHttpMessageConverter());
    this.messageConverters.add(new ResourceHttpMessageConverter());
    this.messageConverters.add(new SourceHttpMessageConverter());
    this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    if (romePresent) {
        this.messageConverters.add(new AtomFeedHttpMessageConverter());
        this.messageConverters.add(new RssChannelHttpMessageConverter());
    }

    if (jackson2XmlPresent) {
        this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
    } else if (jaxb2Present) {
        this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
    }

    if (jackson2Present) {
        this.messageConverters.add(new MappingJackson2HttpMessageConverter());
    } else if (gsonPresent) {
        this.messageConverters.add(new GsonHttpMessageConverter());
    }

}
2
Johnny.Minty