当前位置:   article > 正文

mvc模式中HandlerMethodArgumentResolver如何使用_handlermethodargumentresolver 使用

handlermethodargumentresolver 使用

HandlerMethodArgumentResolver(处理器方法参数解析器)

什么是handler?

HandlerSpring MVC中真正用于处理业务逻辑的类,即标注了

@Controller注解的Controller类;Controller类中使用的@RequestMapping

handler相当于是平常业务代码中每个请求对应的的controller类以及方法信息.文章第一部分的debug截图对应起来更容易理解!
handler来源分析:

  1. 项目启动过程中将所带有@RequestMapping注解的方法对应创建一个requestMappingInfo对象(存储注解中各属性信息);
  2. 项目启动过程中,容器会将所有的认为是handler的bean中的每个方法进行匹配处理,期间会创建handlerMethod,将映射信息RequestMappingInfo与MappingRegistration(其中包含handlerMethod)进行组装map处理,前者为key,后者为value.
  3. 发送请求,解析请求信息,从Map<RequestMappingInfo, MappingRegistration>中根据RequestMappingInfo获取MappingRegistration信息,在从中获取HandlerMethod.

HandlerMethodArgumentResolver如何使用

HandlerMethodArgumentResolver在前端发送请求时,会对请求参数进行判断,如果该请求参数符合**supportsParameter()**方法中参数判断,如参数类型,参数名称等,**resolveArgument()**会对参数进行处理。

以下时前端传进来User类型参数时对数据经行拦截

public boolean supportsParameter(MethodParameter methodParameter) {
        //获取参数类型
        Class<?> clazz = methodParameter.getParameterType();
        return clazz == User.class;
    }
  • 1
  • 2
  • 3
  • 4
  • 5

对该数据经处理返回

/**
     * 思路:先获取到已有参数HttpServletRequest,从中获取到token,再用token作为key从redis拿到User,而HttpServletResponse作用是为了延迟有效期
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);

        String paramToken = request.getParameter(UserService.COOKIE_NAME_TOKEN);
        String cookieToken = getCookieValue(request, UserService.COOKIE_NAME_TOKEN);
        if (StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
            return null;
        }
        String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;
        return userService.getByToken(response, token);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

要使该处理器生效要在配置类中添加该处理器

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

    @Autowired
    UserArgumentResolver userArgumentResolver;
    /**
     * SpringMVC框架回调addArgumentResolvers,然后给Controller的参数赋值
     * @param argumentResolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userArgumentResolver);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/917042
推荐阅读
相关标签
  

闽ICP备14008679号