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