RestTemplate jsonからエンティティークラスへの移行


RestTemplate jsonからエンティティークラスへの移行
RestTemplateを使用してjavaサーバで他のurlのリソースにアクセスする必要がある場合がありますが、結局2台のサーバ(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
  • を添付
            
                com.fasterxml.jackson.core
                jackson-databind
                2.9.5
            
            
                com.fasterxml.jackson.core
                jackson-core
                2.10.0
            
            
                org.springframework
                spring-web
                5.1.10.RELEASE
            
    
  • 踏んだ穴
  • 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