我可以使用@RestController
启用/停用整个@ConditionalOnProperty
,例如:
@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
,则create
方法为即使com.example.api.controller.decision.DecisionController.create.enabled
中没有application.properties
属性,也会启用。
在这种情况下如何正确启用/禁用create
方法?
答案 0 :(得分:4)
您还可以使用aop停止执行方法,并向用户返回一些状态。 我在这里使用注释来标记/识别禁用的方法。如果要基于属性中的某些值禁用该属性,则可以向该注释添加属性。就像您可以添加相同的属性名称和具有值并查找那些属性,依此类推...
@Retention(RUNTIME)
@Target(METHOD)
public @interface DisableMe {}
方面:
@Aspect
@Component
public class DisableCertainAPI {
@Autowired private HttpServletResponse httpServletResponse;
@Pointcut(" @annotation(disableMe)")
protected void disabledMethods(DisableMe disableMe) {
// disabled methods pointcut
}
@Around("disabledMethods(disableMe)")
public void dontRun(JoinPoint jp, DisableMe disableMe) throws IOException {
httpServletResponse.sendError(HttpStatus.NOT_FOUND.value(), "Not found");
}
}
和目标方法:
@DisableMe
@GetMapping(...)
public ResponseEntity<String> doSomething(...){
logger.info("recieved a request");
}
您会看到类似这样的响应:
{
"timestamp": "2019-11-11T16:29:31.454+0000",
"status": 404,
"error": "Not Found",
"message": "Not found",
"path": "/xyz/...."
}
答案 1 :(得分:0)
很遗憾,@ ConditionalOnProperty批注不能用于单个@RequestMapping方法。解决方法是,可以将所需的映射移动到单独的控制器Bean。
http://dolszewski.com/spring/feature-toggle-spring-boot/
我希望这个人可以对同一问题访问此页面的人有所帮助。