web-dev-qa-db-fra.com

Aucun constructeur par défaut trouvé; l'exception imbriquée est Java.lang.NoSuchMethodException avec Spring MVC?

Je travaille avec le projet de contrôleur Spring MVC. Ci-dessous est mon contrôleur et j'ai un constructeur déclaré que j'utilise spécifiquement à des fins de test.

@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

}

Chaque fois que je démarre le serveur, je suis en dessous de l'exception -

No default constructor found; nested exception is Java.lang.NoSuchMethodException:

Mais si je supprime le constructeur TestController, cela fonctionne sans problème. Quel mal je fais ici?

Mais si j'ajoute ce constructeur par défaut, il commence à fonctionner correctement -

    public TestController() {

    }
19
john

Vous devez définir no-args ou constructeur par défaut si vous créez votre propre constructeur.

Vous pouvez lire pourquoi le constructeur d'argument par défaut ou aucun n'est requis.

pourquoi-default-or-no-argument-constructor-Java-class.html

17
prashant thakre

Spring ne peut pas instancier votre TestController car son seul constructeur nécessite un paramètre. Vous pouvez ajouter un constructeur sans argument ou ajouter une annotation @Autowired au constructeur:

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

Dans ce cas, vous dites explicitement à Spring de rechercher dans le contexte d'application un bean KeeperClient et de l'injecter lors de l'instanciation de TestControlller.

35
Ricardo Veguilla

Dans mon cas, le printemps a jeté cela parce que j'ai oublié de rendre statique une classe interne.

Lorsque vous avez constaté que cela n'aide pas même à ajouter un constructeur sans argument, veuillez vérifier votre modificateur.

7
MK Yung

Dans mon cas, j'ai oublié d'ajouter @RequestBody annotation à l'argument de la méthode:

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