我正在使用Spring MVC控制器项目。下面是我的控制器,我有一个声明的构造函数,我专门用于测试目的。
@Controller
public class TestController {
private static KeeperClient testClient = null;
static {
// some code here
}
/**
* Added specifically for unit testing purpose.
*
* @param testClient
*/
public TestController(KeeperClient testClient) {
TestController.testClient = testClient;
}
// some method here
}
每当我启动服务器时,我都会遇到异常 -
No default constructor found; nested exception is java.lang.NoSuchMethodException:
但是如果我删除TestController
构造函数,那么它可以正常工作而没有任何问题。我在这做错了什么?
但是如果我添加这个默认构造函数,那么它就可以正常工作了 -
public TestController() {
}
答案 0 :(得分:30)
Spring无法实例化您的TestController,因为它的唯一构造函数需要一个参数。您可以添加无参数构造函数,也可以将@Autowired注释添加到构造函数中:
@Autowired
public TestController(KeeperClient testClient) {
TestController.testClient = testClient;
}
在这种情况下,您明确告诉Spring在应用程序上下文中搜索KeeperClient bean并在实例化TestControlller时注入它。
答案 1 :(得分:16)
如果要创建自己的构造函数,则必须定义no-args或默认构造函数。
您可以阅读为什么需要默认构造函数或不需要参数构造函数。
答案 2 :(得分:5)
在我的情况下,春天扔了这个因为我忘了让内在的静态。
如果您发现它甚至无法添加无参数构造函数,请检查您的修改器。
答案 3 :(得分:1)
在我的情况下,我忘记在方法参数中添加@RequestBody
注释:
public TestController(@RequestBody KeeperClient testClient) {
TestController.testClient = testClient;
}
答案 4 :(得分:0)
例如,如果您的环境同时使用Guice和Spring并使用构造器@Inject和Play Framework,则如果您错误地使用以下命令自动完成了导入,也会遇到此问题:错误选择:
import com.google.inject.Inject;
然后,即使源@Inject的其余部分看起来与项目中其他工作组件的方式完全相同,并且也可以编译而没有错误,您仍会遇到相同的missing default constructor
错误。
通过以下方法纠正该问题:
import javax.inject.Inject;
不要在构造时间注入时编写默认构造函数。