2017-09-29 2 views
2

Ich möchte eine org.springframework.context.annotation.Condition-Schnittstelle verwenden, um einige @Configuration-Klassen beim Start zu deaktivieren/aktivieren. Beispiel unten:Verwenden von Kontext-Beans innerhalb einer Bedingung oder einer ConfigurationCondition

public class Condition implements ConfigurationCondition { 

    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     //Gets the configuration manager from the context 
     RapidConfDocConfiguration.DocConf docConf = context.getBeanFactory().getBean(DocConf.class); 

     return docConf.isEnabled(); 
    } 
} 

@Configuration 
public class ConfDocConfiguration { 

    @Bean 
    public DocConf docConf() { 
     return new DocConf(true); 
    } 
} 

@Configuration 
@Import(ConfDocConfiguration.class) 
@Conditional({Condition.class}) 
public class RapidSwaggerConfiguration { 
    //Some configurations 
} 

Das Problem, das ich hier habe, ist, dass der Zustand ausgeführt wird, bevor das eine des Kontextes instanziiert wird und dann das ‚DocConf‘ ist noch nicht vorhanden. Die Bedingung funktioniert gut, wenn ich eine Umgebungsvariable oder etwas ähnliches lese.

Also, ist es möglich, diese Art von Bedingung basierend auf einer Spring Bean des Kontextes zu verwenden?

Antwort

0

Dies ist nicht möglich, da Ihre DocConf-Klasse nicht als Konfiguration geladen wird. @Bean-Annotationsbeans werden erst erstellt, nachdem die Konfiguration abgeschlossen ist.

Damit dies funktioniert, müsste Ihre DocConf-Klasse als Spring-Konfiguration dem Kontext hinzugefügt werden, so dass die Einbindung über @Bean aus einer anderen Konfiguration nicht möglich ist, weil nicht konfigurierte Beans erst nach der Konfigurationsphase erstellt werden .

Betrachten Sie diesen Artikel: http://www.javarticles.com/2016/01/spring-configuration-condition-example.html

Ein weiteres Beispiel bei http://javapapers.com/spring/spring-conditional-annotation/

+0

Dank für die Antwort danken. Die DocConf-Bean befindet sich tatsächlich in einer anderen @Configuration. Ich getestet mit dem ConfigurationPhase.REGISTER_BEAN und dem Code: 'context.getBeanFactory(). ContainsBeanDefinition ("docConf") gibt True wie in dem Artikel zurück. Die Definition der Bean ist im Kontext vorhanden, die Bean selbst jedoch nicht: 'context.getBeanFactory(). GetBean ("docConf")' löst eine NoSuchBeanDefinitionException aus. Mein Zweck hier ist in der Lage sein, mit der Bean-Instanz selbst zu interagieren. Ich könnte ein Profil verwenden, aber aus irgendeinem Grund, der meinem Projekt innewohnt, kann ich keine Federprofile verwenden. –

+0

Es kann hilfreich sein zu wissen, wie Sie die DocConf-Konfiguration zum Kontext hinzufügen (z. B. über @Import oder @ComponentScan). – tkruse

+0

@Importieren in die Konfigurationsklasse, die es definiert. Aber ich habe es auch mit einem Komponentenscan versucht. –

Verwandte Themen