Spring Boot @RestController使用属性启用/禁用方法

时间:2018-04-08 07:10:31

标签: java spring spring-boot application-settings

我可以使用@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方法?

2 个答案:

答案 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/

我希望这个人可以对同一问题访问此页面的人有所帮助。