未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException与Spring MVC?

wlwcrazw  于 12个月前  发布在  Spring
关注(0)|答案(6)|浏览(79)

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() {

    }

xxhby3vn

xxhby3vn1#

Spring无法示例化TestController,因为它唯一的构造函数需要一个参数。你可以添加一个no-arg构造函数,或者你可以在构造函数中添加@Autowired注解:

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

字符串
在本例中,您显式地告诉Spring在应用程序上下文中搜索KeeperClientbean,并在示例化TestControlller时注入它。

kqqjbcuj

kqqjbcuj2#

如果要创建自己的构造函数,则必须定义 no-argsdefault 构造函数。
你可以在这里读到为什么需要默认或无参数构造函数:
Why default or no argument constructor is important in Java class?

zfciruhq

zfciruhq3#

在我的例子中,spring抛出了这个,因为我忘记了使内部类成为静态的。
当你发现它甚至没有帮助添加一个无参数的构造函数时,请检查你的修饰符。

zynd9foi

zynd9foi4#

在我的例子中,我忘记在方法参数中添加@RequestBody注解:

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

字符串

pbgvytdp

pbgvytdp5#

如果您的环境使用**Guice和Spring,并使用构造函数@Inject,例如Play Framework,如果您错误地自动完成了导入,并且选择了以下选项,您也会遇到此问题:

import com.google.inject.Inject;

字符串
然后,您会得到相同的missing default constructor错误,即使使用@Inject的源代码的其余部分看起来与项目中的其他工作组件完全相同,并且编译时没有错误。
更正为:

import javax.inject.Inject;


不要编写带有构造时间注入的默认构造函数。

qoefvg9y

qoefvg9y6#

你可以这样做。首先,让我们声明要注入的静态变量NAME_STATIC。之后,我们将创建一个setter方法,名为setNameStatic,并使用@Value注解对其进行注解:public class StringName {

@Value("${name}")
private String name;

private static String NAME_STATIC;

@Value("${name}")
public void setNameStatic(String name){
    PropertyController.NAME_STATIC = name;
}

字符串
}

相关问题