可以使用属性启用/禁用弹簧启动@RestController吗?

Boh*_*ian 47 java spring application-settings spring-boot

给出一个"标准"弹簧启动应用程序@RestController,例如

@RestController
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8")
public class MyController {
    @RequestMapping(value = "bar")
    public ResponseEntity<String> bar(
        return new ResponseEntity<>("Hello world", HttpStatus.OK);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有阻止端点开始的注释或技术可言,如果/除非某个应用程序属性存在/不存在.

注意:测试方法内的属性并且爆炸不是解决方案,因为端点将存在.

我不关心粒度:即只启用/禁用方法或整个类都很好.


由于配置文件不是属性,因此通过配置文件进行控制并不能解决我的问题.

Boh*_*ian 76

我找到了一个简单的解决方案@ConditionalOnExpression:

@RestController
@ConditionalOnExpression("${my.controller.enabled:false}")
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8")
public class MyController {
    @RequestMapping(value = "bar")
    public ResponseEntity<String> bar(
        return new ResponseEntity<>("Hello world", HttpStatus.OK);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加此注释,除非我有

my.controller.enabled=true
Run Code Online (Sandbox Code Playgroud)

在我的application.properties文件中,控制器根本不会启动.

您还可以使用更方便:

@ConditionalOnProperty("my.property")
Run Code Online (Sandbox Code Playgroud)

其行为与上述完全相同; 如果属性存在且"true"组件启动,否则不启动.

  • 你可能想要考虑`@ConditionalOnProperty`,因为它比SpEL评估稍快.试试`@ConditionalOnProperty(prefix ="my.controller",name ="enabled")` (15认同)
  • 在RestController不能为我工作后使用ConditionalOnProperty或ConditionalOnExpression.正在创建Bean的URL仍可访问以下日志中的AdminController RestController:DozerInitializer - Dozer JMX MBean [org.dozer.jmx:type = DozerAdminController]自动向Platform MBean Server注册任何帮助? (3认同)
  • @user666 最佳实践将配置作为(系统测试的)部署包的一部分,因此如果您遵循最佳实践,则预计需要重新启动。无论如何,这种控制通常是“功能切换”,因此激活将是有计划的更改,而不是临时的。对于临时情况,您可能会通过应用程序外部的网络(例如通过负载均衡器)来控制它。 (2认同)