2016-05-05 3 views
1

Моя весна-загрузочные свойства YAML выглядеть следующим образом:весна-загрузки ConditionalOnProperty с картой на основе свойств

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

Это приводит следующие свойства создаются в весеннем среде:

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

I 'd хотел бы определить компонент' mycomponent ', если есть какие-либо свойства, которые соответствуют service.mycomponent.[a-z]*.url. Возможно ли это с использованием @ConditionalOnExpression или какого-либо другого типа @Conditional?

Я понимаю, что могу обойти это, добавив свойство, такое как service.mycomponent.enabled: true, которое может быть использовано с @ConditionalOnProperty, но я предпочел бы избежать этого, если это возможно.

ответ

3

Вот решение, которое я в конечном итоге принимает:

Создать пользовательский Condition который ищет любые свойства с определенным префиксом. RelaxedPropertyResolver имеет удобный метод getSubProperties(). Альтернативные варианты, которые я нашел, были громоздкими, чтобы проходить через экземпляры PropertySource.

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"); 
    } 
} 

Используйте это условие при настройке боб:

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

Я все еще интересно, если то же самое можно сделать с @ConditionalOnExpression напрямую.

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