2016-05-05 1 views
1

Meine Feder-boot yaml Eigenschaften wie folgt aussehen:Frühlings-Boot-ConditionalOnProperty mit kartenbasierten Eigenschaften

service: 
    mycomponent: 
     foo: 
      url: http://foo 
     bar: 
      url: http://bar 

Daraus ergibt sich folgende Eigenschaften im Frühjahr Umgebung gesetzt wird:

service.mycomponent.foo.url: http://foo 
service.mycomponent.bar.url: http://bar 

I Möchte eine 'MyComponent'-Bean definieren, wenn es Eigenschaften gibt, die mit service.mycomponent.[a-z]*.url übereinstimmen. Ist dies unter Verwendung von @ConditionalOnExpression oder einer anderen Art von @Conditional möglich?

Ich weiß, dass ich umgehen kann, indem Sie entweder eine Eigenschaft wie service.mycomponent.enabled: true hinzufügen, die mit @ConditionalOnProperty verwendet werden könnte, aber ich würde das lieber vermeiden, wenn möglich.

Antwort

3

Hier ist die Lösung, die ich Aufnahme endete:

Erstellen eines benutzerdefinierten Condition, die für alle Objekte mit einem bestimmten Präfix sucht. Die RelaxedPropertyResolver hat die bequeme getSubProperties() Methode. Alternative Optionen, die ich fand, waren umständlich, um durch die PropertySource Instanzen zu iterieren.

public class MyComponentCondition extends SpringBootCondition { 
    @Override 
    public ConditionOutcome getMatchOutcome(final ConditionContext context, 
              final AnnotatedTypeMetadata metadata) { 
     final RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment()); 
     final Map<String, Object> properties = resolver.getSubProperties("service.mycomponent."); 
     return new ConditionOutcome(!properties.isEmpty(), "My Component"); 
    } 
} 

diese Bedingung verwenden, wenn die Bohne Einrichtung:

@Conditional(MyComponentCondition.class) 
@Bean 
public MyComponent myComponent() { 
    return new MyComponent(); 
} 

Ich bin immer noch neugierig, wenn die gleiche Sache mit @ConditionalOnExpression direkt getan werden könnte.

Verwandte Themen