Spring MVC аннотации @Inject не работает - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть следующее в моем app-servlet.xml

<mvc:annotation-driven />

<context:component-scan base-package="com.merc.myProject.web.controllers"/>
<context:component-scan base-package="com.merc.myProject.web.forms"/>

все, что у меня есть в пакете контроллера, вводится, но то же самое в пакете форм всегда равно нулю

моя форма выглядит примерно так

public class SelectDatesForm {

    @Inject IUserService userService;
    .....
}

мои контроллеры выглядят так

@Controller
public class SelectDates {

   @Inject IUserService userService;

   .....
}

кто-нибудь, пожалуйста, помогите

Ответы [ 2 ]

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

<context:component-scan> ищет классы, отмеченные такими вещами, как @Component, @Controller, @Service и т. Д., И конфигурирует их как bean-компоненты.Если эти классы имеют свойства, введенные с помощью @Inject или @Resource, то они также будут обрабатываться.

Однако, если ваш класс не содержит аннотаций для начала, то @Inject не будет обрабатываться.Это касается SelectDatesForm.Если вы аннотируете это с помощью @Component, оно должно быть выбрано.

Я был бы здесь немного осторожен - формы, как правило, не являются хорошими кандидатами для бобов Spring, поскольку они, как правило, выбрасываются., временные объекты.

1 голос
/ 15 ноября 2010

Полагаю, ваш SelectDatesForm создается вручную с помощью new, а не получен из контекста Spring.В этом случае это не bean-компонент Spring и, следовательно, не объект для внедрения зависимостей.

Обычно вам не нужно внедрять зависимости в объекты, созданные вручную.Если вам действительно нужно это сделать, у вас есть несколько вариантов:

  • Объявите ваш SelectDatesForm как объект с прототипом и получите его свежий экземпляр из контекста Spring вместо его создания.с new:

    @Component @Scope("prototype")
    public class SelectDatesForm { ... }
    

    и когда вам нужно получить новый экземпляр:

    SelectDatesForm newForm = applicationContext.getBean(SelectDatesForm.class);
    

    Однако этот подход связывает ваш код с Spring 101 ApplicationContext.

  • Если вы не можете управлять созданием SelectDatesForm (т.е. это происходит вне вашего кода), вы можете использовать @Configurable

  • Также вы можете вручную упростить автоматическое подключение объекта, созданного с помощью new:

    SelectDatesForm newForm = new SelectDatesForm();
    applicationContext.getAutowireCapableBeanFactory().autowireBean(newForm);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...