2013-05-20 3 views
5

У меня есть код @Inject работает в одном классе, но не в другом. Вот мой код:Spring annotation @Inject не работает

  • context.xml
<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        "> 
    <bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> 
    <context:component-scan base-package="com.myfashions.services"/> 
    <context:component-scan base-package="com.myfashions.dao"/> 
</beans> 
  • SellerRetriever.java
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
    ... 
} 

UserDAO класс присутствует в com.myfashions.dao пакете. @Inject не работает в Seller.java. Почему?

+1

Является ли '' '' '' '' '' '' '' '' Склад '' '' '' '' '' Продавцу'''? Или вы создаете его с помощью оператора 'new'? –

+1

Спасибо @ nicholas.hauschild и заставил меня узнать мою ошибку. Я создал этот объект с новым оператором. Так вот почему я получил все инъекции null – vicky

+0

'@ Inject' не является весной аннотации – ACV

ответ

2

Я нашел ошибку, я отправляю это, потому что в случае, если кто имеет такую ​​же проблему. Я использовал нового оператора для создания объекта SellerRetriver. Inject не будет работать, если для вызова этого конкретного класса используется новый оператор.

3

Чтобы иметь право на сканирование, ваш класс должен быть аннотированный либо более общей @Component или @Service или @Repositories и т.д .. В вашем случае, @Service логически лучше подходит. Тогда вы можете (если нужно) определить некоторые аспекты (АОП), ориентированные конкретно на вызов служб.

Кроме того, вы можете использовать @Autowired вместо @Inject для извлечения бобов.

Для получения дополнительной информации о различиях в отношении этих двух аннотаций:

What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?

и вы можете увидеть мой комментарий чуть ниже объясняя одну причину, чтобы сохранить @Autowired вместо @Inject.

+0

Его отличный ответ, но все же я получаю NullPointerException. – vicky

+0

Я думал, что вы можете использовать либо '@ Inject', либо' @ Autowired' в сочетании с 'component-scan' ... пока вы используете Spring 3. – Jonathan

+0

добавьте @Component или @ Service или @ Repositories над вашим классом объявление, иначе оно не будет сканироваться. – Mik378

7

Удостоверьтесь, что как SellerRetriever, так и реализация UserDAO аннотируются для сканирования компонентов. Это будет гарантировать, что последний вводится в бывший:

@Service 
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
} 

аннотировать UserDAO реализация с @Component.

При сканировании нескольких путей использования:

<context:component-scan base-package="com.myfashions.services, com.myfashions.dao"/> 
+1

UserDAO вводится в другие классы обслуживания, но не в SellerRetriever.java – vicky

+1

Я предполагаю, что 'ПродавецRetriever' в' com.myfashions.services'. Попробуйте использовать тег сканирования одного компонента в контексте вашего приложения – Reimeus

+0

@Reimeus Это интересное предложение. Может ли Spring провести первое сканирование компонентов и пропустить «UserDAO», потому что он не подходит к нему до тех пор, пока не сканирует второй компонент? – davidfmatheson

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