2013-11-08 2 views
3

Я не могу обработать аннотацию @Autowire с аннотированным классом @Repository.@Autowire не работает с @Repository

У меня есть интерфейс:

public interface AccountRepository { 
    public Account findByUsername(String username); 
    public Account findById(long id); 
    public Account save(Account account); 
} 

и класс, реализующий интерфейс аннотированный с @Repository:

@Repository 
public class AccountRepositoryImpl implements AccountRepository { 
    public Account findByUsername(String username){ 
     //Implementing code 
    } 
    public Account findById(long id){ 
     //Implementing code    
    } 
    public Account save(Account account){ 
     //Implementing code 
    } 
} 

В другом классе, мне нужно использовать такое хранилище, чтобы найти учетную запись по имени пользователя, поэтому я использую autowiring, но я проверяю, работает ли он, и экземпляр accountRepository всегда имеет значение null:

@Component 
public class FooClass { 
    @Autowired 
    private AccountRepository accountRepository; 

    ... 

    public barMethod(){ 
     logger.debug(accountRepository == null ? "accountRepository is NULL" : "accountRepository IS NOT NULL"); 
    } 
} 

Я также установить пакеты для сканирования для компонентов (sessionFactory.setPackagesToScan(new String [] {"com.foo.bar"});), и это делает autowire других классов аннотированных с @Component, например, но в этой аннотации @Repository, всегда пустой.

Я что-то упустил?

+1

Как вы получаете ссылку на 'FooClass'? Вы говорите «FooClass foo = new FooClass();'? – chrylis

+0

Вы нашли проблему, я получал ссылку с помощью 'new' вместо autowiring. Отправьте ответ, если вы хотите принять его как правильный. Спасибо большое! –

+0

Возможный дубликат [Почему моя Spring @Autowired field null?] (Http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

ответ

4

Ваша проблема, скорее всего, заключается в том, что вы создаете компонент непосредственно с помощью new, чтобы Spring не знал об этом.Внесите бонус вместо этого или сделайте фасоль @Configurable и используйте AspectJ.

0

FooClass должен быть создан по весне, чтобы управлять его зависимостями. Убедитесь, что FooClass установлен как компонент (аннотация @Component или @Service, или XML-объявление).

Редактировать: sessionFactory.setPackagesToScan ищет аннотации JPA/Hibernate, тогда как @Repository представляет собой аннотацию Spring Context. AccountRepositoryImpl должен быть весной component-scan сфера

С уважением,

+0

Я ошибаюсь при написании post, FooClass уже аннотируется с @Component, я отредактирую вопрос, чтобы добавить его. Спасибо действительно –

+0

Взгляните на мое собственное редактирование, это может помочь :) – FabienM

+0

Но @Component также представляет собой аннотацию Spring Context, и она отлично работает с другими классами, аннотированными с помощью Component. –

2

Вполне вероятно, что вы не настроили пружине аннотаций быть включен. Я бы рекомендовал взглянуть на аннотации сканирования компонентов. Например, в приложении Java конфигурации:

@ComponentScan(basePackages = { "com.foo" }) 

... или XML-конфигурации:

<context:annotation-config /> 
<context:component-scan base-package="com.foo" /> 

Если FooClass не под базовых пакетов, определенных в этой конфигурации, то @Autowired будет игнорируются.

В качестве дополнительной точки, я рекомендую попробовать @Autowired (обязательно = истина) - что должны вызвать приложение к сбою при запуске, а не ждать, пока вы не используете сервис, чтобы бросить NullPointerException. Однако, если аннотации не настроены, тогда не будет никаких сбоев.

Вы должны проверить, что ваше автоподключение выполняется правильно, с использованием теста JUnit.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(
    classes = MyConfig.class, 
    loader = AnnotationConfigContextLoader.class) 
public class AccountRepositoryTest { 

    @Autowired 
    private AccountRepository accountRepository; 

    @Test 
    public void shouldWireRepository() { 
     assertNotNull(accountRepository); 
    } 

} 

Это должно указывать на правильность вашей базовой конфигурации. Следующим шагом, предполагая, что это развертывается как веб-приложение, было бы проверить, что вы поставили правильные биты и куски в конфигурациях web.xml и foo-servlet.xml для запуска инициализации Spring.

+0

Я добавил '@ComponentScan (basePackages = {" com.foo "})' и мой класс находится под этим пакетом. Я также попытался добавить '', но он не работает. –

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