当前位置: 首页 > 知识库问答 >
问题:

使用属性的 Spring Boot @RestController启用/禁用方法 [重复]

凤高翰
2023-03-14

我可以使用@conditionalnproperty启用/禁用整个@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) {
        ...
    }

}

正如您可能看到的,我已经将@FactionalOnProperty添加到create方法,但这种方法不起作用,并且在启用决策控制器的情况下,即使com.example.api.controller.decision.DecisionController.create.enabled属性在我的application.properties中不存在,也会启用create方法。

在这种情况下如何正确启用/禁用start方法?

共有2个答案

邵亦
2023-03-14

不幸的是,@ConditionalOnProperty批注不能用于单个@RequestMapping方法。作为一种解决方法,您可以将所需的映射移动到一个单独的控制器bean中。

http://dolszewski.com/spring/feature-toggle-spring-boot/

我希望这一个可能帮助以同样的问题来到这个页面的人。

莘聪
2023-03-14

您还可以使用aop不继续执行方法并将某些状态返回给用户。我在这里使用注释来标记/识别禁用的方法。如果您想根据属性中的某些值禁用,您可以向该注释添加属性。就像您可以添加相同的属性名称和havingvalue并查找这些等等...

@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/...."
}
 类似资料:
  • 问题内容: 给定带有的“标准” Spring Boot应用程序,例如 是否存在一种注释或技术,可 在 /除非存在/不存在某个应用程序属性的情况下完全阻止端点启动。 注意:测试方法内部的属性并爆炸不是解决方案,因为端点将存在。 我不在乎粒度:即仅启用/禁用方法或整个类都可以。 由于配置文件不是属性,因此通过配置文件进行控制无法解决我的问题。 问题答案: 我发现使用一个简单的解决方案: 加上这个注释,

  • 给定一个带有RestController的“标准”spring boot应用程序,例如 如果/除非某个应用程序属性存在/不存在,是否有注释或技术可以阻止endpoint启动。 注意:测试方法内部的属性并分解不是解决方案,因为endpoint将存在。 我不关心粒度:即只启用/禁用一个方法或整个类都可以。 因为概要文件不是属性,所以通过概要文件进行控制并不能解决我的问题。

  •       在使用E立方管理平台时,有时会有E立方管理平台在EXCEL中没有显示的情况。这是由于EXCEL将E立方管理平台禁用造成的,需要在禁用项目中启用,就可以正常使用了。       下边分别介绍了 Excel2003、 Excel2007、 Excel2010及以上版本的启用方法 一、 Excel2003的启用方法 帮助-->关于,点击 禁用项目,如果有禁用项目,选中并启用,然后关闭Exce

  • 20.2.3 禁用重启 如果您不想使用重启功能,可以使用spring.devtools.restart.enabled属性将其禁用。在大多数情况下,您可以在application.properties中设置它(这仍会初始化重启类加载器,但是它不会监视文件的变化)。 如果您需要完全禁用对重启的支持,比如,由于重启功能不适用某个特定的库,则需要在调用SpringApplication.run(…​)之

  • 我在src/main/resources下创建了2个文件: 应用程序。属性 第一个具有从env变量中获取值的属性,而后者具有固定值。 根据这里的具体情况,我以这样的方式推出了Spring靴: 然而,不会产生任何影响,并且应用程序是局部的。属性似乎被忽略。 有什么提示吗?

  • 问题内容: 我必须首先禁用输入,然后单击链接以启用它们。 到目前为止,这是我尝试过的方法,但是没有用。 HTML: jQuery的: 这显示给我,然后输入没有任何变化: 问题答案: ** 使用jQuery时,请始终使用该方法来启用或禁用元素(有关原因,请参见下文)。 在您的情况下,它将是: 为什么在可以使用/ 做到这一点时使用? 基本上,应该获取或设置时,可使用特性(如,,和在其他之中)。 通过使