2016-05-16 7 views
0

Ich mache eine Spring-Boot-App, die grundlegende Authentifizierung oder Oauth2 abhängig von einer Eigenschaft, die ich definiert haben muss.Lade Konfiguration Bean dynamisch

Das Problem ist, dass, wenn ich zwei Klassen mit @ Konfiguration erstellt die Anwendung nicht startet, und wenn ich nur eins und in der Configure-Methode ich ein hinzufügen, um das HttpSecurity-Objekt zu konfigurieren, scheitert ich, wenn Sie versuchen, die zu treffen Endpunkt mit Standardauthentifizierung.

Ich versuche bean registrieren dynamisch auf diese Weise:

@Bean 
public ResourceServerSecurityConfig oauthConfig(){ 
    if(isOauthEnabled){ 
     return new ResourceServerSecurityConfig(); 
    }else{ 
     return null; 
    } 
} 
@Bean 
public BasicSecurityConfig basicConfig(){ 
    if(isOauthEnabled){ 
     return new BasicSecurityConfig(); 
    }else{ 
     return null; 
    } 
} 

Aber die Konfiguration nicht geladen wird. Irgendwelche Hinweise, wie dies archiviert werden kann ??

Antwort

1

Was Sie brauchen, ist bedingte Bean-Erstellung. Versuchen Sie es mit @Zusatz.

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Conditional.html

Sie können benutzerdefinierte Bedingungen basierend auf Systemeigenschaften erstellen.

Sie können auch tun es eines mit, wenn aber sein weniger lesbar und Ihre Config-Cluster, aber für ein kurzes Beispiel der:

@Bean 
public SecurityConfig basicConfig(@Value("${authentication.type.oauth}" boolean isOauthEnabled)){ 
    if(isOauthEnabled){ 
     return new ResourceServerSecurityConfig(); 
    }else{ 
     return new BasicSecurityConfig(); 
    } 
} 

Dies ist jedoch ein schmutziger Hack.

+0

Die "@ Conditional" Arbeit! so in etwa. Es lädt die Bean abhängig von einem Wert. Das Problem, das ich jetzt habe, ist, dass ich eine Klasse erstellt habe, die die Condition-Schnittstelle implementiert, aber diese Klasse lädt nicht den "@Value" aus der Eigenschaftendatei. Ich habe versucht, die Klasse mit einer "@Component" annotieren, weil für "@ value" die Klasse sollte eine Bean sein, aber ich kann nicht finden, warum der Wert nicht geladen wird. Wie auch immer, ich habe deine Antwort als die richtige markiert, weil das das ursprüngliche Problem gelöst hat;). Vielen Dank! – aruiz

+1

Finden Sie die Lösung für das letzte Problem. Mit dem ConditionContext aus der Match-Methode konnte ich die Eigenschaften aus der Datei lesen. weil als [link] (http://stackoverflow.com/questions/25276463/how-get-working-value-or-vironment-in-a-class-implementing-the-condition-conf) sagt "Frühling dauert Der von Ihnen angegebene Klassentyp wird instanziiert und instanziiert, um die Übereinstimmungs-Methode zu verwenden. Die Instanz wird nicht als Bean betrachtet, sie führt kein Autowiring oder eine @Value-Verarbeitung durch. Dies gilt auch für BeanFactoryPostProcessor . " – aruiz

0

Haben Sie die Annotation @SpringBootApplication in Spring Boot Application definiert.

Bitte siehe Beispiel unten:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ....... 
     } 
    } 

} 

Auch Sie @Import({ApplicationConfig.class}) zu der Hauptanwendung mit Anmerkungen versehen können.

+0

Ja, ich habe bereits die @SpringBootApplication-Annotation zur Hauptanwendung hinzugefügt. – aruiz

+0

Sie können auch @ Import ({ApplicationConfig.class}) an die Hauptanwendung mit dem Klassennamen der Konfigurationsklasse – shankarsh15

+0

annotieren, aber ich muss eine Konfiguration abhängig von einem Eigenschaftswert laden, dass @import eine Bedingung haben kann? – aruiz

Verwandte Themen