Lombok
lombok 相信大家都不陌生了,一句话带过去:就是一系列注解在编译的时候给大家生产一些常用的基础代码,比如 构造方法、get/set、以及 builder 方式提供的链式编程。
今天讨论的就是使用 @Builder 时带来的意想不到的坑。
@Builder 的坑
@Builder
@Data
public class User{
private Long id;
private String username;
}
通过该注解,你后续可以采用链式编程,比如:
User u = User.builder().id(1l).username("Tom").build();
使用的比较爽,正常用起来没什么问题,但是一旦被 @Builder 注解的在反序列化时会报错:
找不到构造器, 反序列化首先调用无参构造器然后使用 set 方法赋值,而无参构造器是默认就有的,怎么回事呢?问题是出现在加上 @Builder 后才出现的,所以就猜测问题就是该注解带来的,看下源码:
问题清楚了:@Builder 会默认创建了个私有的全参构造器,默认构造器就需要手动添加了,另外加了默认构造器后,@Builder 又不会创建全参构造器了,所以默认和全参构造器都需要加上:
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User{
private Long id;
private String username;
}