zoukankan      html  css  js  c++  java
  • 一个由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);

    轮子:

  • 相关阅读:
    [LeetCode] Minimum Depth of Binary Tree
    [LeetCode] Symmetric Tree
    [Leetcode] Same Tree
    [LeetCode] Binary Tree Preorder/Inorder/Postorder Traversal
    [LeetCode] Copy List with Random Pointe
    [LeetCode] Largest Rectangle in Histogram
    [LeetCode] Longest Valid Parentheses
    SQL Server 2005 数据库复制(转载)
    Nginx 大文件上传解决方案(500M以上)
    百度WebUploader 大文件上传解决方案(500M以上)
  • 原文地址:https://www.cnblogs.com/coniglio/p/12179199.html
Copyright © 2011-2022 走看看