美文网首页JAVA技术文章
RestTemplate中使用ParameterizedType

RestTemplate中使用ParameterizedType

作者: rejoice001 | 来源:发表于2017-12-07 00:55 被阅读324次

    在使用http请求时,往往会封装一个统一的结果类

    package com.plateno.booking.sync.ebk.process.http.response;  
      
    public class  InternalDataServiceResult <T> {  
      
        private String resultCode;  
        private String resultMsg;  
        private T data;  
        public String getResultCode() {  
            return resultCode;  
        }  
        public void setResultCode(String resultCode) {  
            this.resultCode = resultCode;  
        }  
        public String getResultMsg() {  
            return resultMsg;  
        }  
        public void setResultMsg(String resultMsg) {  
            this.resultMsg = resultMsg;  
        }  
        public T getData() {  
            return data;  
        }  
        public void setData(T data) {  
            this.data = data;  
        }  
          
        @Override  
        public String toString() {  
            return "InternalDataServiceResult [resultCode=" + resultCode + ", resultMsg=" + resultMsg + ", data=" + data  
                    + "]";  
        }  
        /** 
         * 是否操作成功 
         * @return 
         */  
        public boolean isSuccess(){  
            return "0".equals(this.resultCode);  
        }  
          
          
    }  
    

    data是实际返回的数据(程序需要的),这里是个T泛型,当T是类似List<OrderInnDay>时,使用普通的RestTemplate.postForObject是无法知道OrderInnDay的类型的,最终T会是List<LinkedHashMap>,这不是我们想要的结果,恰好RestTemplate有其它的方法可以代替,比较麻烦(怪spring没有很好的封装上层方法)

    
    package com.plateno.booking.util;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.PostConstruct;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Lazy;
    import org.springframework.core.ParameterizedTypeReference;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpMethod;
    import org.springframework.stereotype.Component;
    import org.springframework.web.client.RestTemplate;
    
    import com.plateno.booking.bean.InternalDataServiceResult;
    
    @Component
    @Lazy(false)
    public class RestTemplateUtil {
        
        @Autowired
        private RestTemplate xRestTemplate;
        
        private static RestTemplate restTemplate;
        
        public static <T> InternalDataServiceResult<List<T>> exchangeAsList(HttpMethod method,String url, Map<String,Object> params, ParameterizedTypeReference<InternalDataServiceResult<List<T>>> responseType) {
            HttpEntity requestEntity = new HttpEntity(params);
            return restTemplate.exchange(url, method, requestEntity, responseType).getBody();
        }
        
        public static <T> InternalDataServiceResult<List<T>> postForList(String url, Map<String,Object> params, ParameterizedTypeReference<InternalDataServiceResult<List<T>>> responseType){
            return exchangeAsList(HttpMethod.POST, url, params, responseType);
        }
        
        
        @PostConstruct
        public void init(){
            restTemplate = this.xRestTemplate;
        }
    
        public static RestTemplate getRestTemplate() {
            return restTemplate;
        }
    
        public static void setRestTemplate(RestTemplate restTemplate) {
            RestTemplateUtil.restTemplate = restTemplate;
        }
    
        public RestTemplate getxRestTemplate() {
            return xRestTemplate;
        }
    
        public void setxRestTemplate(RestTemplate xRestTemplate) {
            this.xRestTemplate = xRestTemplate;
        }
        
        
    }
    
    

    当需要使用post请求,返回List<OrderInnDay>时,即可这样使用:

    public List<OrderInnDay> getOrderInnDayList(String orderCode,Integer memberId){  
        Map<String, Object> params = new HashMap<>();  
        params.put("orderCode", orderCode);  
        params.put("memberId", memberId);  
        String url = apiProperties.getInternalDataService().getGetOrderInnDayList();  
        log.info("query orderInnDayList,url:{},params:{}", url ,JsonUtil.toJson(params));  
                   //use postForList  
        InternalDataServiceResult<List<OrderInnDay>> result = RestTemplateUtil.postForList(  
                url, params, new ParameterizedTypeReference<InternalDataServiceResult<List<OrderInnDay>>>(){});  
        if (!result.isSuccess()) {  
            log.warn("query orderInnDayList failed:url:{},params:{},response:{}", url,JsonUtil.toJson(params), JsonUtil.toJson(result));  
        }  
        return result.getData();  
    }  
    

    相关文章

      网友评论

        本文标题:RestTemplate中使用ParameterizedType

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