Spring Boot - @RestController 的 @ConditionalOnExpression

ran*_*eiz 5 java rest spring

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

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

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

    @RequestMapping("/hi")
    public String hi() {
        return "hi";
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在 SpEL 表达式中使用动态属性值总是会导致加载@RestController

@RestController
@ConditionalOnExpression("${my.rest.controller.enabled:false}")
public class MyRestController { ... }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*les 5

为了验证未提供 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;
  }
Run Code Online (Sandbox Code Playgroud)


小智 3

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

@ConditionalOnExpression("${my.rest.controller.enabled}==false")
// or
@ConditionalExpression("!${my.rest.controller.enabled}")
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复,问题是 Web 组件和其中的 @RestController 已初始化预配置,因此 ${value} 将始终为 null。 (2认同)