web-dev-qa-db-ja.com

デフォルトのコンストラクタが見つかりません。ネストされた例外は、Spring MVCでのJava.lang.NoSuchMethodExceptionですか?

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

    }
19
john

独自のコンストラクタを作成する場合は、引数なしまたはデフォルトのコンストラクタを定義する必要があります。

デフォルトのコンストラクタまたは引数コンストラクタが不要な理由を読むことができます。

理由またはデフォルトの引数コンストラクタ-Java-class.html

17
prashant thakre

Springは唯一のコンストラクターがパラメーターを必要とするため、TestControllerをインスタンス化できません。引数なしのコンストラクタを追加するか、コンストラクタに@Autowired注釈を追加できます。

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

この場合、SpringにKeeperClient Beanのアプリケーションコンテキストを検索し、TestControlllerをインスタンス化するときに注入するように明示的に指示しています。

35

私の場合、内部クラスを静的にするのを忘れたため、春はこれを投げました。

引数なしのコンストラクタを追加しても効果がない場合は、修飾子を確認してください。

7
MK Yung

私の場合、メソッド引数に@RequestBody注釈を追加するのを忘れていました。

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