今天在写接口实体类转换的时候,使用了**BeanUtils.copyProperties()**方法,但是在后面校验的时候却为空,所以去日志发现两个类里面的字段名相同,属性不同导致。
intgInfoDTO.getContractIntgPartyInfo().forEach(contractIntgPartyInfoDTO -> {
ContractTradingIntgDTO tradingIntgDTO = new ContractTradingIntgDTO();
BeanUtils.copyProperties(contractIntgPartyInfoDTO, tradingIntgDTO);
contractTradingIntgDtos.add(tradingIntgDTO);
});
实体类属性类型不一致
/**
* 变更综合税率
*/
@JsonProperty(value = "changeTax")
private BigDecimal changeTax;
/**
* 变更合同金额(含税) 不包括原合同金额(可能会出现负数情况)
*/
@JsonProperty(value = "changeTaxAmount")
private BigDecimal changeTaxAmount;
/**
* 变更合同金额(不含税) 不包括原合同金额(可能会出现负数情况)
*/
@JsonProperty(value = "changeContractAmount")
private BigDecimal changeContractAmount;
/**
* 变更综合税率
*/
@JsonProperty(value = "changeTax")
private String changeTax;
/**
* 变更合同金额(含税) 不包括原合同金额(可能会出现负数情况)
*/
@JsonProperty(value = "changeTaxAmount")
private String changeTaxAmount;
/**
* 变更合同金额(不含税) 不包括原合同金额(可能会出现负数情况)
*/
@JsonProperty(value = "changeContractAmount")
private String changeContractAmount;
去查看BeanUtils.copyProperties的源码发现,spring在利用反射复制对象时,是以javaBean的规范来使用get/set方法进行设置值的。同时set方法的参与类型,在classLoader中,也会被计为函数名的一部分,所以类型必须一致,否则spring就不会对该属性进行复制相应的值。