RestTemplate json 轉成實體類

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轉成相對應的實體類了。

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章