一个由copyBean引发的血案

一次开发中使用轮子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);

轮子:

发布了9 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_35764295/article/details/81938870