2017-05-25 4 views
0

Ich habe das folgende Szenario, in dem ich in Null-Zeiger-Ausnahme ausgeführt werde, weil Bean nicht initialisiert und zu einem Fehler in meinem Server fehlgeschlagen zu booten. Es gibt einen neu eingeführten Aufruf in der Annotated-Methode PostConstruct, die fehlschlägt. Der gleiche Aufruf wird in einer anderen Methode, die nicht in PostConstruct ist, ausgeführt, die korrekt ausgeführt wird und kein Problem verursacht.Spring Bean wird nicht injiziert

@Component 
@Lazy 
@Primary 
class Parent{ 
@Autowired 
private DesignContextService designContextService; 

@PostConstruct 
private void init(){ 
     designContextService.getMethod();// fails 
} 

private void someFunction(){ 
     designContextService.getMethod();// executes successfully 
} 
} 

} 

Class DesignContextService{ 
@Autowired 
private ContextService contextService; 

public void getMethod(){ 
    contextService.isContextCreated(); 
    ... 
} 
// Below classes present in another jar 
class ContextService{ 
    @Inject 
    public ContextAdapter contextAdapter; 

    public void isContextCreated(){ 
    contextAdapter.isEstablished();// contextAdapter is null . Throws exception here 

} 

} 

} 

Fehler-Stack-Trace:

at 
Caused by org.springframework.beans.factory.BeanCreationException : Error creating bean ... 

at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137) 



at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409) 

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620) 
+0

Ist 'Parent' als Spring-Bean definiert? Die Abhängigkeitsinjektion funktioniert nur in Spring-Beans, nicht in anderen Klassen, die keine Spring Beans sind. Es funktioniert auch nicht, wenn Sie eine Instanz der Klasse mit 'new' erstellen; Sie müssen Spring die Bohnen verwalten lassen. – Jesper

+0

Ja ist es. Ich werde den Beispielcode korrigieren. – jetty

+0

'class DesignContextService' sollte auch mit' @ Service' oder '@ Component' versehen sein, damit der Frühling es richtig autowire. Vielleicht ist das dein Problem? – mingos

Antwort

0

Dies ist wegen der @lazy Anmerkung. Wie in der Dokumentation angegeben:

Das Standardverhalten für ApplicationContext-Implementierungen besteht darin, alle Singleton-Beans beim Start eifrig vorzuinstanzisieren. Vorinstanziierung bedeutet, dass ein ApplicationContext alle seine Singleton-Beans als Teil des Initialisierungsprozesses eifrig erstellt und konfiguriert. Im Allgemeinen ist dies eine gute Sache, weil es bedeutet, dass Fehler in der Konfiguration oder in der Umgebung sofort entdeckt werden (im Gegensatz zu möglicherweise Stunden oder sogar Tagen).

Bitte schauen Sie in den folgenden Link als Referenz: Using Spring @Lazy and @PostConstruct annotations

Spring: how to initialize related lazy beans after main bean creation

+0

Es wurde versucht, die faule Annotation zu entfernen. Das Problem wurde nicht gelöst. :( – jetty

Verwandte Themen