Spring Boot - @RestController的@ConditionalOnExpression

时间:2014-10-29 14:52:13

标签: java spring rest

我想根据配置启用/禁用@RestController,为了实现它,我尝试使用@ConditionalOnExpression注释。

使用静态硬编码值工作得很好:

@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 { ... }

非常感谢您解决此问题的任何想法/最佳做法。

5 个答案:

答案 0 :(得分:3)

spring表达式语言需要计算表达式。我发现使用:false指定ConditionalOnExpression由于某种原因没有正确评估,所以我可以建议几种方法来解决这个问题。

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

答案 1 :(得分:2)

要验证未提供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;
  }

答案 2 :(得分:1)

为基于属性的条件使用 ConditionalOnProperty 注释的最佳方法。

以下是示例:

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

答案 3 :(得分:0)

我觉得那个表达就像 @ConditionalOnExpression("${my.rest.controller.enabled:false}")

非常具有误导性。 ':false'部分告诉我们如果没有my.rest.controller.enabled属性,整个表达式应该被评估为'false'

答案 4 :(得分:0)

我同意@Sploink。 您可以尝试使用

@ConditionalOnExpression("#{${my.rest.controller.enabled}==true}")