RestTemplate json 轉成實體類
有時候我們需要使用RestTemplate在java服務器訪問其他url的資源,但是因爲畢竟是處於兩臺服務器(jvm)中的類,如何進行實體類的傳輸呢?
- 約定實體類
本例子以AgreementApproveForOA
爲結果返回的實體類 - 接受請求的代碼
@ApiOperation(value = "獲取框架協議")
@PostMapping("/getAgreementApprove")
public ResponseEntity<AgreementApproveDTO> getAgreementApprove(@RequestParam Integer fcompanyId, @RequestParam Integer fcompanyType, @RequestHeader("fuid") Integer faid) {
return xxx;
}
- 轉化實例
public static AgreementApproveForOA getData() throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.add("fuid", "2");//設置header
String url = "http://localhost:8481/admin/admin/agreementApprove/getAgreementApprove?fcompanyId=174&fcompanyType=1";
ResponseEntity<String> data = restTemplate.postForEntity(url, new HttpEntity<String>(headers), String.class);//獲取json串
AgreementResponseEntity agreementResponseEntity;
//readValue(json字符串,json串對應裝配的實體類)
agreementResponseEntity = mapper.readValue(data.getBody(), AgreementResponseEntity.class);
return agreementResponseEntity.getRetEntity();
}
- 附上依賴
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
- 踩過的坑
jackson
包不支持2019-01-05 13:25:10
這種格式,會出現以下錯誤
Cannot deserialize value of type `java.util.Date` from String "2019-10-03 00:00:00": not a valid representation (error: Failed to parse Date value '2019-10-03 00:00:00': Cannot parse date "2019-10-03 00:00:00": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))
- 解決方法:自定義日期解析器
解決方法引用自:鏈接
Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder = new Jackson2ObjectMapperBuilder();
mapper = jackson2ObjectMapperBuilder.build();
DateFormat dateFormat = mapper.getDateFormat();
mapper.setDateFormat(new MyDateFormat(dateFormat));
MyDateFormat.java
public class MyDateFormat extends DateFormat {
private DateFormat dateFormat;
private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
public MyDateFormat(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
@Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
return dateFormat.format(date, toAppendTo, fieldPosition);
}
@Override
public Date parse(String source, ParsePosition pos) {
Date date = null;
try {
date = format1.parse(source, pos);
} catch (Exception e) {
date = dateFormat.parse(source, pos);
}
return date;
}
// 主要還是裝飾這個方法
@Override
public Date parse(String source) throws ParseException {
Date date = null;
try {
// 先按我的規則來
date = format1.parse(source);
} catch (Exception e) {
// 不行,那就按原先的規則吧
date = dateFormat.parse(source);
}
return date;
}
// 這裏裝飾clone方法的原因是因爲clone方法在jackson中也有用到
@Override
public Object clone() {
Object format = dateFormat.clone();
return new MyDateFormat((DateFormat) format);
}
}
這樣就可以把json轉成相對應的實體類了。