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

Spring MVC:如何获取请求的处理程序方法

商瀚
2023-03-14

我试图根据Spring的RequestMapping注释方法上存在的注释来实现一些逻辑

所以我在我的方法中有一个HttpServletRequest实例,我想问Spring“给我一个方法,它将被调用来处理这个请求”,所以我可以使用反射API来询问我的注释是否存在或不存在,所以我可以更改处理。

有没有什么简单的方法可以从Spring MVC获取这些信息?

共有2个答案

严言
2023-03-14

在@ali dehgani的回答的帮助下,我有了一个更灵活的实现,不需要注册拦截器。您确实需要传递绑定到该方法的请求对象。

private boolean isHandlerMethodAnnotated(HttpServletRequest request ) {
        WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
        Map<String, HandlerMapping> handlerMappingMap = BeanFactoryUtils.beansOfTypeIncludingAncestors(webApplicationContext, HandlerMapping.class, true, false);
        try {
            HandlerMapping handlerMapping = handlerMappingMap.get(RequestMappingHandlerMapping.class.getName());
            HandlerExecutionChain handlerExecutionChain = handlerMapping.getHandler(request);
            Object handler = handlerExecutionChain.getHandler();
            if(handler instanceof HandlerMethod){
                Annotation methodAnnotation = ((HandlerMethod) handler).getMethodAnnotation(MyAnnotation.class);
                return methodAnnotation!=null;
            }
        } catch (Exception e) {
            logger.warn(e);
        }
        return false;
    }
云霖
2023-03-14

我想您有一个处理程序方法,如:

@SomeAnnotation
@RequestMapping(...)
public Something doHandle(...) { ... }

并且您想为所有用@某个注释注释的处理程序方法添加一些预处理逻辑。您可以实现HandlerInterceptor并将您的预处理逻辑放入preHandle方法中:

public class SomeLogicInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) throws Exception {

        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            SomeAnnotation someAnnotation = handlerMethod.getMethodAnnotation(SomeAnnotation.class);
            if (someAnnotation != null) {
                // Put your logic here
            }
        }

        return true; // return false if you want to abort the execution chain
    }
}

另外,不要忘记在web配置中注册拦截器:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SomeLogicInterceptor());
    }
}
 类似资料:
  • 本文向大家介绍springmvc处理异步请求的示例,包括了springmvc处理异步请求的示例的使用技巧和注意事项,需要的朋友参考一下 springmvc 3.2开始就支持servlet3.0的异步请求。平常我们请求一个controller一般都是同步的,如果在代码执行中,遇到耗时的业务操作,那servlet容器线程就会被锁死,当有其他请求进来的时候就会受堵了。 springmvc3.2之后支持异

  • 本文向大家介绍学习SpringMVC——如何获取请求参数详解,包括了学习SpringMVC——如何获取请求参数详解的使用技巧和注意事项,需要的朋友参考一下 @RequestParam,你一定见过;@PathVariable,你肯定也知道;@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!没错

  • 问题内容: 我正在制作一个Java Servlet页面,该页面检查域名列表,并通过jquery ajax请求检查每个名称。它的工作正常,除非结果被无序附加到DOM。什么是按请求的顺序处理请求的最佳方法,但是又像长时间轮询一样异步进行。我是javascript新手。 这是我用于请求的代码: 我当时正在考虑向Java Servlet发送一个序列号,该序列号将通过JSON返回,但是我想知道是否有更简单的

  • 问题内容: 我是一个Node.js新手,并且正在用它创建我的第一个大型应用程序(我正在使用Express)。当用户使用get请求加载ID时,我需要让我的网页执行一些javascript画布绘制 我知道我可以用一个简单的方法来处理 但我不知道如何使用该ID的要求的图纸开始我的网页。互联网上Express和Get上的每个教程都说明了如何处理get请求…这个问题是关于“接下来会发生什么?” 改写:我不确

  • 本文向大家介绍Springmvc ajax跨域请求处理方法实例详解,包括了Springmvc ajax跨域请求处理方法实例详解的使用技巧和注意事项,需要的朋友参考一下 上次给一个网站写网站  前后端分离 最后跪在ajax跨域上面了  自己在网上找了个方法  亲试可用  记录一下 写一个类  继承HandlerInterceptorAdapter 然后在xml里面配置一下路径  这样就可以了  不过

  • 基础的 Servlet 接口定义了 service 方法用于处理客户端的请求。当有请求到达时,该方法由 servlet 容器路由到一个 servlet 实例来调用。 Web 应用的并发请求处理通常需要 Web 开发人员去设计适合多线程执行的Servlet,从而保证 service 方法能在一个特定时间点处理多线程并发执行。(译者注: Servlet 默认是线程不安全的,需要开发人员处理多线程问题)