一个由copyBean引发的血案

与程序的故事 专栏收录该内容
34 篇文章 0 订阅

一次开发中使用轮子Bean互转突然发生了问题

Paper paper = new Paper();
paper.setdLevel(1);
PaperDTO dto = new PaperDTO();
dto = BeanCopyUtils.copyBean(paper, PaperDTO.class);


System.out.println(dto.getDLevel());

打印出输出结果:

 

输出结果却变成NULL,怎么肥事呢


通过对比发现这个字段被忽略掉了,别的字段都能成功的被转换,你这么这么傲娇呢?仔细查看这个字段自动生成的get、set方法

public Integer getdLevel() {
    return dLevel;
}

public void setdLevel(Integer dLevel) {
    this.dLevel = dLevel;
}

发现set、get后生成的是小写,而dto的get、set用的是@Data注解,这里就顺便介绍下@Data注解:

这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用@Data 注解时, 需要导入lombok.Data,下面列举下 lombok提供的注解:

val : 和 scala 中 val 同名, 可以在运行时确定类型;

@NonNull : 注解在参数上, 如果该类参数为 null , 就会报出异常,  
throw new NullPointException(参数名)

@Cleanup : 注释在引用变量前, 自动回收资源 默认调用
 close() 方法

@Getter/@Setter : 注解在类上, 为类提供读写属性

@Getter(lazy=true) :

@ToString : 注解在类上, 为类提供 toString() 方法

@EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 
hashCode() 方法

@NoArgsConstructor, @RequiredArgsConstructor, 
@AllArgsConstructor : 注解在类上, 为类提供无参,
有指定必须参数,全参构造函数

@Data : 注解在类上, 为类提供读写属性, 此外还提供了
equals()、hashCode()、toString() 方法

@Value :

@Builder : 注解在类上, 为类提供一个内部的 Builder

@SneakThrows :

@Synchronized : 注解在方法上, 为方法提供同步锁

@Log :

@Log4j : 注解在类上, 为类提供一个属性名为 log 的
 log4j 的日志对象

@Slf4j : 注解在类上, 为类提供一个属性名为 log 的 
log4j 的日志对象

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = 
new CoolBar(parent, 0);
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);

上面一些注解是由包含关系的, 看需要什么方法就增加什么注解,@Log4j 和 @Slf4j 注解作用不小, 用在各层都可以,方便打 log。

简易例子:[ 只是用了@Data注解 ]

public @Data class Student {
     
     private String stuId;
     private String stuName;
     private String stuNum;
     private String stuSex;
 }

当然放在类的上面也是OK的啦

好了言归正传,发生了这种情况后,我们来看下@Data和自动生成的get、set会怎么辩解呢

@Data:这个锅我肯定不背。

自动生成:我比@Data早出来混了这么多年,这个锅我也不背。

既然他们都不背,那我们就统一get、set用@Data生成就可以避免这种情况的再次发生。另外使用spring的工具是可以忽略大写小的哦。附上他们的处理:

spring:

BeanUtils.copyProperties(paper, dto);

轮子:

 

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:博客之星2020 设计师:CSDN官方博客 返回首页

打赏作者

三省同学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值