SpringBoot集成RestTemplate组件

3,142 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

背景

搭建SpringBoot项目框架,将要集成远程调用统一解决方案,来对其他服务的接口进行访问。

比如Http接口、WebService接口等等的其他服务对外暴露的接口。

针对SpringBoot环境集成RestTemplate组件,并且生成出相关的工具类,进而使开发效率有更好的提升。

实现的具体部署

还是一样,要先在pom文件引入相应的jar包。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

不要太过好奇为什么不引入RestTemplate的jar包,因为starter-web依赖就已经默认引入了相应包了。

引入这个包之后,我们就可以在相应的类中进行属性装配了,如下代码:

@Autowired
private RestTemplate restTemplate;

通过这种方式就可以调用相关的方法了,当然这里也可以直接new一个RestTemplate对象也是可以的。

扩展

集成RestTemplate,不只是引入一个jar包就可以了,更多的是根据项目的实际情况不同,去做出一些自定义调整,我这里是引入了一个自动配置类,我把代码贴出来,大家可以进行一个参考。

@Configuration
public class RestTemplateAutoConfiguration {

    /**
     * 连接超时时间
     */
    @Value("${rest.connection.timeout}")
    private Integer connectionTimeout;

    /**
     * 信息读取超时时间
     */
    @Value("${rest.read.timeout}")
    private Integer readTimeout;

    /**
     * 声明RestTemplate服务
     * @return RestTemplate
     */
    @Bean
    public RestTemplate registerTemplate(ClientHttpRequestFactory simileClientHttpRequestFactory) {
        RestTemplate restTemplate = new RestTemplate();
        //配置自定义的message转换器
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        messageConverters.add(new RestTemplateHttpMessageConverter());
        restTemplate.setMessageConverters(messageConverters);
        //配置自定义的interceptor拦截器
        List<ClientHttpRequestInterceptor> interceptors= new ArrayList<>();
        interceptors.add(new HeadClientHttpRequestInterceptor());
        interceptors.add(new TrackLogClientHttpRequestInterceptor());
        restTemplate.setInterceptors(interceptors);
        //配置自定义的异常处理
        restTemplate.setErrorHandler(new RestTemplateExceptionHandle());
        restTemplate.setRequestFactory(simileClientHttpRequestFactory);
        return restTemplate;
    }

    /**
     * 初始化请求工厂
     * @return SimpleClientHttpRequestFactory
     */
    @Bean
    public SimpleClientHttpRequestFactory getFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(connectionTimeout);
        factory.setReadTimeout(readTimeout);
        return factory;
    }

    /**
     * 数据转换器
     */
    static class RestTemplateHttpMessageConverter extends MappingJackson2HttpMessageConverter {
        public RestTemplateHttpMessageConverter() {
            List<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.TEXT_PLAIN);
            mediaTypes.add(MediaType.TEXT_HTML);  //加入text/html类型的支持
            setSupportedMediaTypes(mediaTypes);// tag6
        }

    }

}

当然了,在application.yml中也要对其进行参数的配置,如下代码所示。

rest:
  connection:
    timeout: 10000
  read:
    timeout: 20000