一个由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);

轮子:


浙公网安备 33010602011771号