美文网首页
RestTemplate 反序列化带泛型的返回值

RestTemplate 反序列化带泛型的返回值

作者: 我想编程 | 来源:发表于2018-03-14 23:44 被阅读1773次

使用RestTemplate

配置bean注入的方式

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);;
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);
        factory.setConnectTimeout(5000);
        return factory;
    }
}

配置拦截器

实现ClientHttpRequestInterceptor

public class HttpInterceptor implements ClientHttpRequestInterceptor {

    private Logger log = LoggerFactory.getLogger(HttpInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body,
            ClientHttpRequestExecution execution) throws IOException {
        log.info("请求地址:{}", request.getURI());
        log.info("请求方法: {}", request.getMethod());
        log.info("请求内容:{}", new String(body));
        log.info("请求头:{}", request.getHeaders());
        return execution.execute(request, body);
    }
}

修改生成RestTemplate的bean,添加拦截器

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        RestTemplate restTemplate = new RestTemplate(factory);
        restTemplate.getInterceptors().add(new HttpInterceptor());
        return restTemplate;
    }

使用RestTemplate

RequestBean requestBean = new RequestBean();
        requestBean.setTest1("1");
        requestBean.setTest2("2");
        requestBean.setTest3("3");
        RestTemplate restTemplate = new RestTemplate();
        ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);

返回的数据中带有泛型

上面的例子是普通的类型确定的返回值,通常我们请求接口是有一个固定的返回bean,会有一个泛型的data,RestTemplate需要知道泛型的类型(在Apache-HttpClient中是接收String的json字符串,然后用json序列化工具反序列化成特定类型)。RestTemplate提供了一个ParameterizedTypeReference可以解决这个问题。具体使用如下

        ResponseEntity<RequestModel<LoginResultDTO>> responseEntity = this.restTemplate
                .exchange(LOGIN_URL, HttpMethod.POST,
                        new HttpEntity<LoginRequestDTO>(login),
                        new ParameterizedTypeReference<RequestModel<LoginResultDTO>>() {
                        });

相关文章

  • RestTemplate 反序列化带泛型的返回值

    使用RestTemplate 配置bean注入的方式 配置拦截器 实现ClientHttpRequestInter...

  • RestTemplate返回值带有泛型

  • swift泛型协议在函数中做参数和返回值

    泛型协议在函数中作为参数和返回值类型使用泛型协议只能作为泛型的约束使用,不能直接作为函数参数或者返回值类型使用。就...

  • spring resttemplate泛型

    resttemplate是一个很方便的HTTP客户端,但是当返回的数据类型是泛型时会报错 原因:postForOb...

  • Java高级语言

    泛型 为什么需要泛型 重构相同函数体且不同类型返回值和参数时,可以使用泛型。而不需要多个重构函数比如: 泛型中的类...

  • 当反射遇上泛型该如何处理

    由于后面讲到的反序列化器在反序列化List的时候需要确定泛型的type,所以这边先讲一下针对类型擦除的泛型,我们要...

  • Java泛型

    java泛型解决容器,不确定类型问题,多个返回值,避免类型转换。 类泛型 类泛型定义的时候需要在类型后增加尖括号,...

  • Java泛型使用

    JDK7和之后版本至少具有根据返回值类型确定泛型类型的能力.对应的文章链接(讲解如何根据返回值进行确定泛型类型,看...

  • java泛型的小技巧

    代码 总结3点 在方法的返回值前使用"<>"申明泛型,在参数中有用到泛型的地方,才可以使用这个泛型类型(当然...

  • 《Oracle Java SE编程指南》20-04:泛型方法

    内容导航: 前言 1、定义 1、定义 方法也可以声明成泛型方法,只要在返回值前声明泛型参数列表即可。泛型方法使得该...

网友评论

      本文标题:RestTemplate 反序列化带泛型的返回值

      本文链接:https://www.haomeiwen.com/subject/innqqftx.html