【发布时间】:2018-04-08 07:10:30
【问题描述】:
我可以使用@ConditionalOnProperty启用/禁用整个@RestController,例如:
@RestController
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.enabled", havingValue = "true")
@RequestMapping("/v1.0/decisions")
public class DecisionController {
}
以下配置工作正常。但我需要对此控制器进行更细粒度的控制,并启用/禁用对内部某些方法的访问,例如:
@RestController
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.enabled", havingValue = "true")
@RequestMapping("/v1.0/decisions")
public class DecisionController {
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.create.enabled", havingValue = "true")
@PreAuthorize("isAuthenticated()")
@RequestMapping(method = RequestMethod.POST)
public DecisionResponse create(@Valid @RequestBody CreateDecisionRequest request, Authentication authentication) {
...
}
}
如您所见,我已将@ConditionalOnProperty 添加到create 方法,但此方法不起作用,并且在启用DecisionController 的情况下,即使com.example.api.controller.decision.DecisionController.create.enabled 属性不存在,create 方法也会启用在我的application.properties。
在这种情况下如何正确启用/禁用create 方法?
【问题讨论】:
-
只是好奇:用例是什么?为什么要禁用某些方法?
-
@JBNizet 我有定义核心端点和方法的核心项目(Maven 模块)。另外,我有项目特定的 Maven 子模块,其中包括提到的核心模块作为依赖项。根据我的子模块项目中的业务需求和配置,我需要隐藏一些继承自核心项目的核心功能(一些方法)。现在我可以隐藏整个控制器,但我需要更细粒度的控制。
-
最简单的方法可能是使用过滤器,并拦截对某些 URL/HTTP 方法的请求,如果它们被禁用则返回 404。
标签: java spring spring-boot application-settings