美文网首页程序员
采坑: Lombok 的 boolean 序列化问题

采坑: Lombok 的 boolean 序列化问题

作者: 凌云_00 | 来源:发表于2020-10-21 17:26 被阅读0次
    问题复现

      今天碰到一个小问题,调用方反馈我们支付回调接口返回的数据字段和文档定义不一致.文档定义的字段名称是 isClose,而实际返回字段是 close.
      我赶紧查看源码,代码非常简单,只有Lombok 注解,那问题的源头肯定是使用Lombok注解导致的了!

    • 源码
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class PayCallBackResponse implements Serializable {
    
        private static final long serialVersionUID = 4454976958022297251L;
    
        boolean isClose;
    }
    
    • lombok 生成的set方法
             PayCallBackResponse response = new PayCallBackResponse();
             response.setClose(Boolean.FALSE);
    

      这样一看就很明了,都是 Lombok 惹得祸

    修复方案

      修复方式非常简单,将属性类型修改为 Boolean 包装类型即可

    • 源码
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class PayCallBackResponse implements Serializable {
    
        private static final long serialVersionUID = 4454976958022297251L;
     
        Boolean isClose;
    }
    
    • 修复后,lombok 生成的set方法
            PayCallBackResponse response = new PayCallBackResponse();
            response.setIsClose(Boolean.FALSE);
    
    问题原因

      时间关系并没有查看 Lombok 源码,但是根据经验猜测,是因为 Lombok 遵守 JavaBean 规范(布尔类型 的字段命名是 isXxx 时,get/set 方法可以省略 is前缀)引起的.Mybatis 源码中的 JavaBean 解析也有此类问题.

    相关文章

      网友评论

        本文标题:采坑: Lombok 的 boolean 序列化问题

        本文链接:https://www.haomeiwen.com/subject/ndsemktx.html