2010-11-15 2 views
0

я следующий в моем приложении-servlet.xmlSpring MVC аннотация @Inject не работает

<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; 

    ..... 
} 

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

ответ

1

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

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

  • возвещать SelectDatesForm в качестве прототипа областью действия фасоли и получить свежий экземпляр этого из контекста Spring вместо того, чтобы создавать его с new:

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

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

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

    Однако, этот подход пары ваш код с весны ApplicationContext.

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

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

    SelectDatesForm newForm = new SelectDatesForm(); 
    applicationContext.getAutowireCapableBeanFactory().autowireBean(newForm); 
    
+0

Спасибо за тонну за эту информацию и неприятности, которые вы взяли, чтобы объяснить. – user373201

4

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

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

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

+0

Благодарим за отзыв. Я попытался поставить @Service, а также @Component. только по одному, но я получаю одно и то же исключение. Потому что инъекции не произошло. – user373201

Смежные вопросы