关于使用Lombok的@Builder创建充血模型实体类对象无参构造器不执行的问题
开发时遇到了一个很奇怪的问题,使用充血模型对象内的更新方法出现了空指针报错,代码如下:
@Data
@Builder
@AllArgsConstructor
public class ExampleEntity {
private String variable1;
private String variable2;
private ApplicationContext context;
// 仓储层,负责查询数据库
private ExampleEntityResipostory exampleEntityResipostory;
// 无参构造器用来注入仓储层的Bean
public ExampleEntity() {
this.exampleEntityResipostory = context.getBean(ExampleEntityResipostory.class);
}
// 根据variable2更新variable1
public Boolean updateVariable1ByVariable2(String newVariable1) {
if (null == newVariable1) {
return Boolean.FALSE;
}
return exampleEntityResipostory.updateVariable1ByVariable2(newVariable1, this.variable2);
}
}
在理想的正常情况下,创建该实体类的时候会首先调用无参构造器将仓储层的类注入,然后正常调用更新即可。但这次我调用更新方法却发现抛出了NPE异常,异常栈打印的空指针错误指向了更新方法的最后一行: return exampleEntityResipostory.updateVariable1ByVariable2(newVariable1, this.variable2); 。
我首先打印出了更新前创建的实体类查看,发现打印出的实体类仓储类参数为null,这就解释了为什么会报出空指针,因为调用了null的方法 updateVariable1ByVariable2 。接着我读了下创建实体类代码,发现实体类并不是通过 new ExampleEntity(); 的方式创建的,而是另一个方法返回的,之后一路溯源,最终发现了创建实体类的源头: ExampleEntity.builder().bulid; 。对于 @builder 的创建实体类对象的方式我也不清楚,于是我询问了下DeepSeek,它是这样回答我的:使用 @builder 注解的实体类默认会创造一个全参构造器,而 builder() 方法会自动调用该全参构造器,即使自定义了一个无参构造器,该方法也不会调用。
所以总结一下就是这样:当使用了 @builder 注解后,如果想要通过 builder() 方法创建实体类对象,必须确保不需要自定义构造器的内容,因为 builder() 方法会直接调用 @builder 生成的全参构造器,假如无参构造器中存放了重要的实体类初始化内容,那建议就不要使用该注解了。

浙公网安备 33010602011771号