@AllArgsConstructor无法与Spring Bean一起使用。

3

我正在上如下所示的课程

@Controller
@RequestMapping(value = "/test")
@AllArgsConstructor
public class TestController {

    @Qualifier("userDAO")
    private final Test testDAO;

} 

以下是我的bean注册。

<bean id="userDAO" class="com.test.dao.TestImpl"
      p:sqlSessionFactory-ref="testSqlSessionFactory" />

当我运行我的应用程序时,出现如下错误:
No default constructor found; nested exception is java.lang.NoSuchMethodException bean configuration

我尝试在根目录中添加了lombok.config文件,并复制了Qualifier注解,但没有帮助。

spring版本为3.2.15,lombok版本为1.18.16。

以下方法可以正常工作。

@Autowired
public TestController(@Qualifier("userDAO") final Test testDAO) {
    this.testDAO = testDAO;
}

如何解决这个问题?


1
“默认构造函数”是指没有参数的构造函数;就我所知,它与@AllArgs相反。 - rzwitserloot
只需将@AllArgsConstructor更改为@NoArgsConstructor,注入就应该可以工作了。 - FaltFe
你看过这个吗?它似乎与你的问题非常相似:https://dev59.com/2lkT5IYBdhLWcg3wefXR 你可以尝试Алексей Виноградов在那里提出的快速修复,或者采用被接受的答案提供的更长的解决方案。 - Spasoje Petronijević
1
我尝试使用 lombok.config 文件并添加 lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier,但仍然没有起作用。 - Remo
仅添加@AllArgsConstructor是不够的,因为它只会添加构造函数,但是它不会添加@Autowired。由于缺少它,它将寻找默认构造函数。您还需要指示lombok将@Autowired添加到构造函数中。或者升级到Spring 4.3或更高版本,它将自动检测单个构造函数并使用它。 - M. Deinum
@M.Deinum 奇怪的是,如果我的类实现了一个接口,那么应该在Spring >= 4.3中工作的自动检测就不起作用了。如果我删除实现,则它可以正常工作。我正在使用Spring Boot 2.7.3,并且使用Java 11。 - Boss Man
1个回答

2
仅仅添加@AllArgsConstructor是不够的,因为它只会添加构造函数,但是没有添加@Autowired。由于缺少这个注解,Spring会寻找默认构造函数。
为了修复这个问题,你可以采取以下三种方法之一:
  1. 升级到Spring 4.3或更高版本,这样Spring将自动使用单个构造函数并进行自动装配。
  2. 指示lombok在构造函数中添加@Autowired注解。
  3. 放弃使用lombok,手动提供构造函数。
第一种方法应该很容易(在依赖项中包含新版本的Spring)。第二种方法需要一些额外的代码。
@Controller
@RequestMapping(value = "/test")
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {

    private final Test testDAO;

} 
@Qualifier在这里无法发挥作用(应该删除),因为它应该在构造函数参数上使用。针对这种情况,我建议放弃 Lombok,直接添加构造函数(选项 3)。
@Controller
@RequestMapping(value = "/test")
public class TestController {

    private final Test testDAO;

    @Autowired
    public TestController(@Qualifier("userDAO") Test testDao) {
        this.testDao=testDao;
    }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接