2014-10-29 6 views
2

Я хочу включить/отключить @RestController на основе конфигурации, чтобы добиться этого. Я пытаюсь использовать аннотацию @ConditionalOnExpression.Spring Boot - @ConditionalOnExpression для @RestController

Использования статического жёстко прописанного значения работает просто отлично:

@RestController 
@ConditionalOnExpression("true") 
public class MyRestController { 

    @RequestMapping("/hi") 
    public String hi() { 
     return "hi"; 
    } 
} 

Тем не менее, используя динамическое значение свойства в выражении SPEL всегда приводит к не загрузке @RestController:

@RestController 
@ConditionalOnExpression("${my.rest.controller.enabled:false}") 
public class MyRestController { ... } 

бы действительно ценят любые идеи/лучшие практики для решения этой проблемы.

ответ

2

Язык выражения весны требует выражения для оценки. Я обнаружил, что использование: false для указания ConditionalOnExpression по какой-либо причине не оценивается должным образом, поэтому я могу предложить пару способов обойти эту проблему.

@ConditionalOnExpression("${my.rest.controller.enabled}==false") 
// or 
@ConditionalExpression("!${my.rest.controller.enabled}") 
+2

Спасибо за ответ, проблема заключается в том, что веб-компоненты , и @RestController среди них, являются инициализированными предварительными конфигурациями, поэтому значение $ {value} всегда будет равно нулю. – ranweiz

+0

@ranweiz Как вы это разрешили? в моем случае контроллер всегда работает, даже я использовал @ConditionalOnExpression («1 == 0») –

0

Я думаю, что выражение как @ConditionalOnExpression("${my.rest.controller.enabled:false}")

очень missleading. «Ложь» часть говорит, что если нет my.rest.controller.enabled собственности, все выражение должно быть оценено на «ложь»

1

Лучший способ использовать ConditionalOnProperty аннотацию для условий на основе свойств.

Вот пример:

@RestController 
@ConditionalOnProperty(prefix="my.rest.controller", name="enabled", havingValue = "true") 
public class MyRestController { ... } 
0

Чтобы проверить, что свойство в Spring Cloud Config не предусмотрено, я использовал следующее выражение:

/** 
    * @return The Jms Template for sending the messages to the queue. 
    */ 
    @Bean(name = "jmsTemplate") 
    @ConditionalOnExpression("!'${jsk.messaging.jms.queue}'.isEmpty()") 
    public JmsTemplate jmsTemplateForQueues() { 
    JmsTemplate jmsTemplate = new JmsTemplate(); 
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(activeMQConnectionFactory()); 
    jmsTemplate.setConnectionFactory(cachingConnectionFactory); 
    return jmsTemplate; 
    } 
Смежные вопросы