首页 > 解决方案 > 如何将参数传递给使用 @RequiredArgsConstructor 的类的构造函数?

问题描述

我正在尝试通过构造函数drMessage实例化一个传递参数的类,我正在使用 @RequiredArgsConstructor 注释,以及使用 @Autowired 的一些依赖注入,如下所示,问题是当使用 @RequiredArgsConstructor 注释时,它在内部实现了默认构造函数,并且我尝试手动构建构造函数,但IDE告诉我这些构造函数的变量尚未初始化,我该如何解决?谢谢

     @RequiredArgsConstructor
     @Service
     public class ServiceImpl implements IService {

     @Autowired
     private final DtoMapper dtoMapper;

     @Autowired
     private final CDtoMapper cDtoMapper;

     private DrMessage drMessage;


     **other sentences**


     }

标签: javaspring-bootlombok

解决方案


Lombok 在编译时工作,而 Spring 在运行时工作。因此,当您在您的类(它可以是常规的 java 类、spring bean 等)上放置构造函数的 Lombok 注释(@AllArgsConstructor@RequiredArgsConstructor等)时,Lombok 会为您创建一个构造函数。在这种情况下,它将为所有最终字段创建一个构造函数(请参阅文档

如您所见,lombok 没有考虑@Autowired注释,由于您没有放置@NonNull注释drMessage(检查文档),因此不会为其生成构造函数参数,因此您的类将如下所示:

 @RequiredArgsConstructor
 @Service
 public class ServiceImpl implements IService {

 @Autowired
 private final DtoMapper dtoMapper;

 @Autowired
 private final CDtoMapper cDtoMapper;

 private DrMessage drMessage;

 public ServiceImpl(DtoMapper dtoMapper, cDtoMapper cDtoMapper) {
   this.dtoMapper = dtoMapper;
   this.cDtoMapper = cDtoMapper;
 }
     **other sentences**

}

因此,如果您希望 lombok 生成参数以DrMessage使其成为最终参数,或者在其上添加@NonNull注释。

至此,Lombok 的工作就完成了,实际上,您可以完全将其排除在运行时可用之外。现在关于弹簧部分:

首先,您说您自己正在尝试创建ServiceImpl类的实例,为什么?它是一个 spring bean(你已经在上面放了一个@Service注解),所以让 Spring 管理这个类。

有了这个定义,放在@Autowiredfinal 字段上在春天是行不通的。看到这个线程,所以你不应该@Autowired放在这些字段上。幸运的是,Spring 在其最新版本中足够聪明,可以理解如果该类有一个构造函数(在您的情况下是您使用 Lombok 生成的构造函数),spring 将调用它来创建您的类的实例,而不是字段注入,您将使用构造函数注入。


推荐阅读