找不到默认构造函数;嵌套异常是使用Spring MVC的java.lang.NoSuchMethodException?

时间:2014-08-12 19:28:57

标签: java spring spring-mvc model-view-controller

我正在使用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() {

    }

5 个答案:

答案 0 :(得分:30)

Spring无法实例化您的TestController,因为它的唯一构造函数需要一个参数。您可以添加无参数构造函数,也可以将@Autowired注释添加到构造函数中:

@Autowired
public TestController(KeeperClient testClient) {
    TestController.testClient = testClient;
}

在这种情况下,您明确告诉Spring在应用程序上下文中搜索KeeperClient bean并在实例化TestControlller时注入它。

答案 1 :(得分:16)

如果要创建自己的构造函数,则必须定义no-args或默认构造函数。

您可以阅读为什么需要默认构造函数或不需要参数构造函数。

why-default-or-no-argument-constructor-java-class.html

答案 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;

不要在构造时间注入时编写默认构造函数。