Java 弹簧启动-@RestController的@ConditionalOnExpression

Java 弹簧启动-@RestController的@ConditionalOnExpression,java,spring,rest,Java,Spring,Rest,我想根据配置启用/禁用@RestController,为了实现它,我正在尝试使用@ConditionalOnExpression注释 使用静态硬编码值工作正常: @RestController @ConditionalOnExpression("true") public class MyRestController { @RequestMapping("/hi") public String hi() { return "hi"; } } 但是,在S

我想根据配置启用/禁用
@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 { ... }

如果您有任何想法/最佳实践来解决此问题,我们将不胜感激。

spring表达式语言需要对表达式进行求值。我发现由于某些原因,使用:false指定ConditionalOnExpression无法正确计算,因此我可以建议几种解决此问题的方法

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

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

这是非常错误的。“:false”部分说明,如果没有my.rest.controller.enabled属性,则整个表达式应计算为“false”

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

下面是一个例子:

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

为了验证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;
  }
我同意@Sploink。 你可以尝试使用


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

感谢您的回复,问题是web组件和其中的@RestController都是预配置初始化的,因此${value}将始终为空。@ranweiz您是如何解决的?在我的例子中,即使我在Spring2.1中使用了@ConditionalOnExpression(“1==0”),控制器也始终在工作。它需要一个冒号(因此默认值为空)@ThomasRS它需要什么场景?