BeanUtils.copyProperties 如果Integer 或Long 为null 默认赋值0

本文探讨了BeanUtils.copyProperties方法的一个潜在问题:当复制Integer类型的null值时,该方法会将其转换为0而非保持null状态。这可能导致业务逻辑错误。文章推荐使用PropertyUtils.copyProperties作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

BeanUtils.copyProperties(A,B);

如果B中的Integer类型的数据是null的,那么通过这个方法复制给A后,这个null的Integer数据会变成0。

也就是它有自己的规则,如果发现Integer类型的数据如果是null的,它会自作多情的给个默认值!

这个自作多情是很让开发人员反感的!比如Integer类型的数据=null是一个逻辑业务,但是经过复制后之前的业务逻辑就不执行了!!!

 

 

解决方法:使用PropertyUtils.copyProperties(A,B),注:数据类型里面有data类型的可能会存在问题

 

详情:http://hi.baidu.com/yljf1314/item/27c1d52dfa76c598b7326389

@Override public void createPrintData(DeliveryDto deliveryDto) { List<DeliveryDetailDto> deliveryDetailDtoList = deliveryDto.getDeliveryDetailDtoList(); List<DeliveryPrintManagement> deliveryPrintManagements = new ArrayList<>(); deliveryDetailDtoList.forEach(v -> { //箱数量 Integer packageNum = v.getPackageNum(); List<String> boxCodes = ResponseData.check(iapNumberGeneratorService.createSerialNumberBatch(IapSysSerialNumberType.BOX_CODE.getCode(), packageNum)); //根据箱数生成箱号、箱内数量、标签号 for(int i = 1;i<=v.getPackageNum();i++){ DeliveryPrintManagement dto = new DeliveryPrintManagement(); BeanUtils.copyProperties(v,dto,"id"); dto.setDeliveryId(deliveryDto.getId()); dto.setDeliveryDetailId(v.getId()); dto.setDeliveryNo(deliveryDto.getDeliveryNo()); dto.setDeliveryDetailRowNo(v.getRowNo()); dto.setPackageQuantity(v.getSingleNum()); dto.setProductDate(DateUtil.formatDate(v.getProductDate())); /** * 箱号 * 生成规则:供应商编码+年月日+三位流水 * 根据包装箱数生成对应的箱号,例:包装箱数为5,则生成五个箱号,生成的箱号不可重复。 */ if(dto.getBoxCode() == null) { dto.setBoxCode(dto.getSupplierCode() + boxCodes.get(i-1)); } /** * 批次号 */ dto.setBatchNumber(dto.getSupplierCode() + DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN)); /** * 箱内数量 * 最后一箱放除不尽的余数,如一箱数量为5个,总数量为16个,需要4箱,最后一箱的数量为1个 */ int remainder = v.getDeliveryQuantity().intValue() % v.getSingleNum(); if(i == packageNum && remainder != 0) { dto.setQuantity(remainder); }else{ dto.setQuantity(v.getSingleNum()); } /** * 标签号 * 展示规则根据包装箱数字段决定,例包装箱数为5,则会生成五个标签,标签展示顺序依次为1/5,2/5,3/5,4/5,5/5, * 左侧数字为当前标签,右侧展示标签为最大标签值。 */ dto.setCaseCodeLabel(i +"/" + packageNum); dto.setCaseCodeLabelNum(i); /** * 二维码:箱号(16)+库存组织编码+单包装数量+供应商编码+订单号 */ // String qrCode = "(I)" + dto.getBoxCode() + "||" // + "(S)" + dto.getPurchaseNo() + "||" // + "(P)" + dto.getMaterialCode() + "||" // + "(Q)" + dto.getQuantity() + "||" // + "(L)" + "||" // + "(C)" + dto.getSupplierCode() + "||" // + "(R)" + dto.getBatchNumber() + "||" // + "(D)" + DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN); String ulFileUrl = "1"; if(ulFileUrl == null){ ulFileUrl = "my"; }else { ulFileUrl = deliveryDto.getDeliveryNo(); } String qrCode = dto.getSupplierCode() + "|" + ulFileUrl + "|" + v.getRowNo() + "|" + dto.getBoxCode(); dto.setQrCode(qrCode); if(StrUtil.isNotEmpty(v.getUl())){ dto.setUlFileUrl(ulFileUrl); } deliveryPrintManagements.add(dto); } }); if(CollectionUtil.isNotEmpty(deliveryPrintManagements)){ deliveryPrintManagementService.saveBatch(deliveryPrintManagements); } } }为什么qrCode中deliveryDto.getDeliveryNo() 的返回给前端为空
最新发布
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值