Обязательно ли для аннотированного контроллера Spring нужен конструктор по умолчанию - PullRequest
3 голосов
/ 07 ноября 2010

У меня есть пружинный контроллер, который использует аннотации. Я дал этому контроллеру конструктор, который принимает два аргумента. Я хочу оба способа инициализации контроллера: инжектор конструктора и инжектор сеттера.

@Controller("viewQuestionController")
@RequestMapping("/public/viewQuestions")
public class ViewQuestionController
{
    @Resource(name="questionService")
    private QuestionService questionService;

   /*public ViewQuestionController()
 {
    int i=0;
    i++;
 } 
   */   

public ViewQuestionController(@Qualifier("questionService") QuestionService questionService)
{
    this.questionService = questionService;
}

@Resource(name="questionService")
public void setQuestionService(QuestionService questionService)
{
    this.questionService = questionService;
}
}   

Когда я раскомментирую конструктор по умолчанию, контроллер запускается правильно. Однако, если нет, я получаю исключение BeanInstantiationException, конструктор по умолчанию не найден; Вложенное исключение - java.lang.NoSuchMethodException. Итак, моя конфигурация для аннотированного конструктора неверна или полностью аннотированный контроллер весной всегда нуждается в конструкторе по умолчанию?

Ответы [ 2 ]

4 голосов
/ 07 ноября 2010

Если вы хотите настроить инжекцию конструктора с помощью аннотаций, вам нужно поместить соответствующую аннотацию на конструктор. Я не уверен, как это можно сделать с @Resource, но @Autowired и @Inject поддерживают его:

@Autowired
public ViewQuestionController(@Qualifier("questionService") QuestionService questionService) 

или

@Inject
public ViewQuestionController(@Named("questionService") QuestionService questionService) 
1 голос
/ 07 ноября 2010

Я думаю, что бинам Controller нужен конструктор по умолчанию, так как они инициализируются платформой, но нет способа сообщить платформе, что она обеспечивает зависимость.

Подумав, почему бы вам не подключить службу вопросов, а Spring позаботится об этом. Следующий код должен быть хорошим

 @Controller("viewQuestionController")
 @RequestMapping("/public/viewQuestions")
 public class ViewQuestionController
 {
       @Autowired
       private QuestionService questionService;

       //Not providing any constructor would also be fine
       public ViewQuestionController(){}

questionService будет правильно инициализирован Spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...