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它需要什么场景?