2014-12-09 2 views
1

Когда я создаю свой , myBean Constructors используются успешно. Но после создания бобов null с использованием @Autowired тегов.@Autowired Spring NullPointerException Null Beans после ApplicationContext Creation

Я, хотя @Autowired, заменил бы getBean() как-нибудь? Неужели я ошибаюсь?

Зачем мне нужно позвонить GetBean, когда я уже создал свои бобы (во время запуска ApplicationContext), а также Autowired?

Вот что я сделал до сих пор:

Главная:

@EnableAutoConfiguration 
@Configuration 
@ComponentScan("com.somePackage") 
public class Main { 
    ApplicationContext ctx= new AnnotationConfigApplicationContext(AppConfig.class); 

    SomeBean myBean = ctx.getBean(SomeBean.class); 
    myBean.doSomething();//succeeds 

    AnyOtherClass aoc = new AnyOtherClass();//Nullpointer (see AnyOtherClass.class for details) 

} 

AnyOtherClass:

public class AnyOtherClass { 
    @Autowired 
    protected SomeBean someBean; 

    public AnyOtherClass(){ 
     someBean.doSomething();//Nullpointer 
    } 

AppConfig:

@Configuration 
public class AppConfig { 
    @Bean 
    @Autowired 
    public SomeBean BeanSomeBean() { 
     return new SomeBean(); 
    } 
} 

MyBean:

public class SomeBean { 
    public SomeBean(){} 
    public void doSomething() { 
     System.out.println("do Something.."); 
    } 
} 

Примечание: Интерфейс ApplicationContextAware работает нормально, но без @Autowired. И я бы очень хотел пойти с @Autowired, так как это звучит более комфортно и менее ошибочно для меня.

+1

make 'AnyOtherClass' имеет аннотацию' @ Component' и удостоверьтесь, что автоскан видит ее – EpicPandaForce

ответ

2

Для @Autowired для работы в AnyOtherClass, AnyOtherClass должен быть фасоль.
Нечто подобное

AppConfig

@Configuration 
public class AppConfig { 
    @Bean 
    @Autowired 
    public SomeBean BeanSomeBean() { 
     return new SomeBean(); 
    } 

    @Bean 
    @Autowired 
    public AnyOtherClass BeanAnyOtherClass() { 
     return new AnyOtherClass(); 
    } 
} 

Главная

@EnableAutoConfiguration 
@Configuration 
@ComponentScan("com.somePackage") 
public class Main { 
    ApplicationContext ctx= new AnnotationConfigApplicationContext(AppConfig.class); 

    SomeBean myBean = ctx.getBean(SomeBean.class); 
    myBean.doSomething();//succeeds 

    AnyOtherClass aoc = ctx.getBean(AnyOtherClass.class); 

} 

Если экземпляр класса с использованием new AnyOtherClass(), он обойдет Весну и ни один из аннотации не будет работать , Вы должны получить его из контекста Spring, чтобы он был весенним бобом.

+0

Я угадываю ее как компонент в AppConfig, который я загружаю в Main.class. Или вы хотите определить его как Bean в обоих местах (AppConfig & AnyOtherClass)? – Hansa

+0

@ Ханса Просто чтобы понять, что я имел в виду, я не говорю о классе 'SomeBean', но класс, который вводит его с помощью' @ Autowired'. Таким образом, 'SomeBean' уже является компонентом Spring (объявлен в' AppConfig'), но 'AnyOtherClass' также должен быть компонентом Spring (объявлен в' AppConfig' или аннотирован с '@ Component', расположенным в пакете, который является scanned ('com.somePackage')) –

+0

Хм, что означало бы для меня. Я добавляю« @autowired static AnyOtherClass aoc' в Main. ('static', потому что он в основном ..) Затем я получаю: BeanCreationException-> BeanInstantiationException-> вложенное исключение - java.lang.NullPointerException – Hansa

0

Попробуйте

@Component 
public class AnyOtherClass { 
@Autowired 
protected SomeBean someBean; 

public AnyOtherClass(){ 
    someBean.doSomething();//Nullpointer 
} 

Кроме того, вы должны убедиться, что этот класс находится в пакете com.somePackage.

+0

спасибо за ответ - но ничего не меняет = ( – Hansa

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