RestTemplate中使用ParameterizedType
2017-12-07 本文已影响324人
rejoice001
在使用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();
}