【问题标题】:No default constructor found; nested exception is java.lang.NoSuchMethodException with Spring MVC?未找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException 与 Spring MVC?
【发布时间】:2023-03-25 08:10:01
【问题描述】:

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

    }

【问题讨论】:

  • 您需要添加一个无参数构造函数才能让@Controller 工作。 public TestController() {} 。当您删除自定义构造函数时,默认构造函数(无参数)变为可用,但在存在带参数的构造函数时,不隐式存在无参数构造函数。
  • @TJ 是的,添加后它工作正常,但在我没有任何默认构造函数之前,刚才我添加了带参数的构造函数然后它开始失败。
  • 添加另一个无参数的构造函数。你可以有多个构造函数。 Polymorphism。在没有显式定义的构造函数的情况下,默认的无参数构造函数是隐式的。
  • 这是简单的 Java:如果您没有任何构造函数,那么将为您创建一个默认的无参数构造函数。创建自己的构造函数后,您有责任创建一个默认构造函数(如果需要)。由于 Java Bean 需要默认构造函数,因此您会收到错误消息。

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


【解决方案1】:

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

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

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

【讨论】:

  • 在构造函数中使用@Value注解时也是如此。 Spring 只需要知道你想要注入一些东西。
【解决方案2】:

如果您要创建自己的构造函数,则必须定义无参数或默认构造函数。

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

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

【讨论】:

  • 我也收到此错误,但我无法添加默认构造函数,因为我使用的是来自 jar 文件的类。类名:FormDataContentDisposition,jar 文件:jersey,如何避免这个问题??
  • @NibrasSameeh 让我知道这是否可以帮助您stackoverflow.com/questions/40113406/…
  • 感谢您的回复,这个问题是我自己问的,我还没有得到正确的答案。
【解决方案3】:

在我的例子中,spring 抛出了这个,因为我忘记将内部类设为静态。

当您发现添加无参数构造函数也无济于事时,请检查您的修饰符。

【讨论】:

  • 遇到了同样的问题 - 我只是简单地把课程调高了。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    import com.google.inject.Inject;
    

    然后你得到相同的missing default constructor 错误,即使你的源代码的其余部分与@Inject 看起来与你项目中其他工作组件的方式完全相同并且编译没有错误。

    更正:

    import javax.inject.Inject;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2012-03-06
      • 2014-07-03
      • 1970-01-01
      • 2017-11-07
      • 2013-12-24
      相关资源
      最近更新 更多