博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring的annotation-driven
阅读量:7089 次
发布时间:2019-06-28

本文共 4338 字,大约阅读时间需要 14 分钟。

  hot3.png

argument resolvers

  1.   spring的请求处理都是方法级别,围绕方法上的处理,当你需要针对请求参数做一些特殊的处理,不同的类型获得不同的处理。我这边项目有一个需求是在controller里面获得session里面的用户信息,我们普通采用的方法是直接从session里面获取,需要指定具体的key。从里面获得,如果调用登录用户的地方很多的时候,处理的逻辑也是相当冗余的。
  2. 这边利用spring的argument resolvers(参数解析),针对自定义注解来注入用户到方法级别。

     先定义注解:

@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface UserAttribute {}

里面可以扩展你需要对用户处理的逻辑。

在是实现spring的HandlerMethodArgumentResolver --这个接口是操作处理方法的参数处理。

spring在处理请求参数时,针对不同注解或者不同类型例如HttpRequest,HttpResponse的值的赋值。默认都是有一个组合的处理器,注册一些默认的处理方式,我下面把注册的地方添加进来。

在RequestMappingHandlerAdapter类里面的afterPropertiesSet方法里面。

public void afterPropertiesSet() {		// Do this first, it may add ResponseBody advice beans		initControllerAdviceCache();                //请求参数初始的解析器             if (this.argumentResolvers == null) {			List
resolvers = getDefaultArgumentResolvers(); this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); }                //初始绑定参数的解析器 if (this.initBinderArgumentResolvers == null) { List
resolvers = getDefaultInitBinderArgumentResolvers(); this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); }                //初始方法返回值的包装器 if (this.returnValueHandlers == null) { List
handlers = getDefaultReturnValueHandlers(); this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers); } }

每一个都有一个默认配置,以下是请求参数的默认解析器。

private List
getDefaultArgumentResolvers() { List
resolvers = new ArrayList
(); // Annotation-based argument resolution resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false)); --@requestParam注解 resolvers.add(new RequestParamMapMethodArgumentResolver()); resolvers.add(new PathVariableMethodArgumentResolver());--@pathVariable注解 resolvers.add(new PathVariableMapMethodArgumentResolver()); resolvers.add(new MatrixVariableMethodArgumentResolver()); resolvers.add(new MatrixVariableMapMethodArgumentResolver()); resolvers.add(new ServletModelAttributeMethodProcessor(false)); resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory())); resolvers.add(new RequestHeaderMapMethodArgumentResolver()); resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory())); resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory())); // Type-based argument resolution resolvers.add(new ServletRequestMethodArgumentResolver()); resolvers.add(new ServletResponseMethodArgumentResolver()); resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RedirectAttributesMethodArgumentResolver()); resolvers.add(new ModelMethodProcessor()); resolvers.add(new MapMethodProcessor()); resolvers.add(new ErrorsMethodArgumentResolver()); resolvers.add(new SessionStatusMethodArgumentResolver()); resolvers.add(new UriComponentsBuilderMethodArgumentResolver()); // Custom arguments                // 添加自定义解析器 if (getCustomArgumentResolvers() != null) { resolvers.addAll(getCustomArgumentResolvers()); } // Catch-all resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); resolvers.add(new ServletModelAttributeMethodProcessor(true)); return resolvers; }

感兴趣的话可以这些请求参数的解析方式都看一下,了解一下每一个种类型的解析方式。

回归正题,我们现在集成接口后需要实现两个方法。

supportsParameter 和 resolveArgument,默认自定义的解析器是在最后面。判断supportsParameter支持是否为true,如果为true就走下面resolveArgument方法,

里面返回值就是你需要处理的对象,需要封装你自己的处理逻辑针对注解。

public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);        HttpSession session = request.getSession();        UserInfo user = (UserInfo)session.getAttribute(Constant.USER_INFO_SESSION);        return user;    }

这样就能通过注解在方法上获取到登录的用户信息。

return-value-handlers的处理方式在spring里面还是有一点不一样。下面会介绍。

转载于:https://my.oschina.net/zooy/blog/672452

你可能感兴趣的文章
JSP中include指令和include行为区别
查看>>
关于zend studio 9.0版本汉化
查看>>
java web编程学习6
查看>>
CSS学习笔记——最基础的定义与使用
查看>>
形象的网络状况工具
查看>>
linux下mysql的root密码忘记解决方法
查看>>
Test
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
范围分为
查看>>
一致性Hash算法(Consistent Hash)
查看>>
update the drawPictures
查看>>
Java中throw和throws的区别
查看>>
线程池
查看>>
人生路上的得与失,我要重新起航
查看>>
利用移动硬盘安装windows7系统
查看>>
Windows mobile UI
查看>>
Android 自动更新APP时确定安装后没有显示安装完成页面
查看>>
APUE第八章学习札记之进程用户ID与文件用户权限相关知识总结
查看>>
c++中::的用法和命名空间
查看>>
My First Angular 2 App
查看>>