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

以编程方式控制@RestController可用性

卫阳曜
2023-03-14

是否可以以编程方式控制@RestController以启用或禁用它?我不想只是在每个@RequestMapping方法中编写代码来执行某种 if (!enabled) { 返回 404Exception; }

我见过这个问题,但这只适用于启动时。我真正需要的是允许我多次启用或禁用控制器的东西。

我想过不同的方法,但不知道哪些在Spring可行。

  1. 实际上控制容器(在我的例子中是jetty),因此对该特定endpoint的请求被禁用。
  2. 以某种方式控制<code>RequestMappingHandlerMapping</code>因为似乎是那个类完成了URL和控制器之间的映射</li>了
  3. 控制@RestController组件的生命周期,以便我可以随意创建和销毁它,但我不知道如何触发到endpoint的映射

共有1个答案

何禄
2023-03-14

如果最终结果是,当您决定应该禁用某个特定endpoint时,您希望用404进行响应,那么您可以编写一个拦截器来检查您的enabled条件是否为false,如果是,则相应地设置响应。

例如:

@Component
public class ConditionalRejectionInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        String requestUri = request.getRequestURI();
        if (shouldReject(requestUri)) {
            response.setStatus(HttpStatus.NOT_FOUND.value());
            return false;
        }
        return super.preHandle(request, response, handler);
    }

    private boolean shouldReject(String requestUri) {
        // presumably you have some mechanism of inferring or discovering whether 
        // the endpoint represented by requestUri should be allowed or disallowed
        return ...;
    }
}

在Spring Boot中,注册您自己的拦截器只需要实现一个WebMvcConfigrerAdapter。例如:

@Configuration
public class CustomWebMvcConfigurer extends WebMvcConfigurerAdapter {

  @Autowired 
  private HandlerInterceptor conditionalRejectionInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // you can use .addPathPatterns(...) here to limit this interceptor to specific endpoints
    // this could be used to replace any 'conditional on the value of requestUri' code in the interceptor
    registry.addInterceptor(conditionalRejectionInterceptor);
  }
}
 类似资料:
  • 问题内容: 我们可以通过编程方式在自己的Java代码中使用javap吗? 例如,以下代码: 在命令行中使用javap,我们得到了: 我可以使用javap的API仅打印常量池吗? 问题答案: Apache BCEL 提供.class文件解析的封装,该封装提供了一组API。几乎对于.class文件中的每个元素,BECL API中都有一个对应的Class来表示它。因此,从某种角度来说,如果您只想打印出类

  • 我正在尝试通过代码更改白色标记图像的颜色。我已经阅读了下面的代码应该改变颜色,但我的标记仍然是白色的。 我错过了什么吗?有没有其他方法可以更改位于我的res文件夹中的可绘制对象的颜色?

  • 场景:我将默认设备方向设置为纵向。但是,我想允许横向模式的一些视图。 我的大多数视图不需要是横向的。但是有一些带有方向检测,允许以横向模式显示全尺寸线性图。 我希望我的应用程序在大多数情况下都以肖像为中心。 问:我如何在需要的时候冻结肖像,但在情况允许的情况下允许风景?

  • 建议你使用声明式访问控制来实现业务网络定义中的访问控制规则。但是,你可以通过获取和测试当前参与者,在交易处理器中实现可编程的访问控制。你可以针对当前参与者的属性运行测试,以允许或拒绝交易处理器函数的执行。 在你开始之前 在你执行这些步骤之前,你必须对业务网络定义中的参与者进行建模,并将其部署为业务网络。你必须创建了这些参与者的一些实例,并向这些参与者发放身份。 下节的过程显示了使用下面参与者模型的

  • 问题内容: 我正在尝试制作一个视图,该视图将作为一种“面板”,附加到视图控制器的右侧。 也就是说,它绑定到父视图控制器的尾部,顶部和底部边距,静态宽度为300 但是,我似乎无法正确解决问题,我要么打破约束,要么做某件事xcode告诉我是非法的。 我究竟做错了什么? 这是控制器中的代码 问题答案: 其实在你的代码的问题是,你没有设置的到,只要你想使用自动布局限制,那么你必须设置一个以虚假的。另一个问

  • 问题内容: 当存在后置条件时,该方法的返回值一定不能为null,该怎么办? 我可以 但是断言可以关闭! 那可以吗 ? 还是针对此类情况使用用户定义的异常(例如NullReturnValueException)更好? 问题答案: 我认为在JVM为您执行操作之前尽早抛出NPE没问题-特别是对于null参数。对此似乎有一些争论,但是Java SE库中有许多示例正是这样做的。我不明白为什么NPE在您自己不