Подтвердить что ты не робот

Конструктор по умолчанию не найден; Вложенное исключение - это java.lang.NoSuchMethodException с Spring MVC?

Я работаю с проектом Spring MVC controller. Ниже мой контроллер, и у меня есть конструктор, который я специально использую для целей тестирования.

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

    }
4b9b3361

Ответ 1

Вам нужно определить конструктор no-args или default, если вы создаете свой собственный конструктор.

Вы можете прочитать, почему требуется конструктор аргументов default или no.

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

Ответ 2

Spring не может создать экземпляр вашего TestController, потому что для его единственного конструктора требуется параметр. Вы можете добавить конструктор no-arg или добавить в конструктор @Autowired аннотацию:

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

В этом случае вы явно указываете Spring искать контекст приложения для KeeperClient bean и вводить его при создании экземпляра TestControlller.

Ответ 3

В моем случае, spring бросил это, потому что я забыл сделать внутренний класс статическим.

Когда вы обнаружили, что это не помогает даже добавить конструктор no-arg, проверьте свой модификатор.

Ответ 4

В моем случае я забыл добавить аннотацию @RequestBody к аргументу метода:

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