HandlerMethodArgumentResolver 自定义封装参数bean

转载 2015年11月18日 11:24:08

小生最近写代码遇到一个小问题,一个controller有8个api,不过有7个api依赖登录api记录的session。如果session存在,则需要从session中获取clientId和password,否则退出到登录页面。

        最开始我是在BaseController 中定义了一个公用的设置clientId和password的方法,后来发现这样很不优雅。于是想到了拦截器,但是拦截器针对每个方法都会调用,而且定位待处理的参数也不方便。最后我想到

HandlerMethodArgumentResolver 加注解的方式。下面贴出代码片段。

         
        

参数注解代码  收藏代码
  1. @Target(ElementType.PARAMETER)  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. public @interface BrokerRequestArgument {  
  4. }  

    

参数解释器代码  收藏代码
  1. public class BrokerRequestResolver implements HandlerMethodArgumentResolver {  
  2.   
  3.     @Override  
  4.     public boolean supportsParameter(MethodParameter parameter) {  
  5.         return parameter.getParameterAnnotation(BrokerRequestArgument.class) != null;  
  6.     }  
  7.   
  8.     @Override  
  9.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {  
  10.         String token = webRequest.getHeader("X-token");  
  11.         LoginUserModel loginUserModel = (LoginUserModel) webRequest.getAttribute(token, RequestAttributes.SCOPE_SESSION);  
  12.   
  13.         Object obj = BeanUtils.instantiate(parameter.getParameterType());  
  14.         BeanWrapper wrapper = PropertyAccessorFactory  
  15.                 .forBeanPropertyAccess(obj);  
  16.         Field[] fields = parameter.getParameterType().getDeclaredFields();  
  17.         Map<String, Field> fieldMap = Maps.newHashMap();  
  18.         for (Field field : fields) {  
  19.             fieldMap.put(field.getName(), field);  
  20.         }  
  21.   
  22.         for (Iterator<String> paramNames = webRequest.getParameterNames(); paramNames.hasNext(); ) {  
  23.             String paramName = paramNames.next();  
  24.             Object o = webRequest.getParameter(paramName) ;  
  25.             wrapper.setPropertyValue(paramName,o);  
  26.         }  
  27.         wrapper.setPropertyValue("clientId",loginUserModel.getClientId());  
  28.         wrapper.setPropertyValue("password",loginUserModel.getPassword());  
  29.         return obj;  
  30.     }  
  31. }  

 

    

Java代码  收藏代码
  1. <mvc:annotation-driven>  
  2.         <mvc:argument-resolvers>  
  3.             <bean class="  
  4. cn.xxx.xxx.web.resolver.BrokerRequestResolver" lazy-init="false"/>  
  5.         </mvc:argument-resolvers>  
  6.  </mvc:annotation-driven>  

 

    

Java代码  收藏代码
  1. @RequestMapping(value = "/his_trade_entrusts", method = RequestMethod.GET)  
  2.     @ResponseBody  
  3.     public String hisEntrustQry(HttpServletRequest request, PagingQueryRequest brokerRequest) {  
  4.         setClientIdAndPassword(request,brokerRequest);  
  5.         BrokerResponse brokerResponse = guojinTradeService.hisEntrustQry(brokerRequest);  
  6.         return pagingResponse(brokerResponse);  
  7.     }  
  8.   
  9. //变成了  
  10.   
  11. @RequestMapping(value = "/his_trade_entrusts", method = RequestMethod.GET)  
  12.     @ResponseBody  
  13.     public String hisEntrustQry( @BrokerRequestArgument PagingQueryRequest brokerRequest) {  
  14.         BrokerResponse brokerResponse = guojinTradeService.hisEntrustQry(brokerRequest);  
  15.         return pagingResponse(brokerResponse);  
  16.     }  

   
    这样代码就优雅多了!

相关文章推荐

YTKNetwork 使用基础教程

本教程将讲解 YTKNetwork 的基本功能的使用。 YTKNetwork 基本组成 YTKNetwork 包括以下几个基本的类: YTKNetworkConfig 类:用于统...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...

Radon变换入门matlab CT原理

http://hi.baidu.com/hi9394/blog/item/0d492b8bfd714700c8fc7aa9.html 简介 图像投影,就是说将图像在某一方向上做线性积分(或理解为累...

Intel系列处理器的三种工作模式

Intel系列处理器的三种工作模式 微机中常用的Intel系列微处理器的主要发展过程是:8080,8086/8088,80186, 80286,80386,80486,Pentium,Pen...

js弹出框、对话框、提示框、弹窗总结

js弹出框、对话框、提示框、弹窗总结 一、JS的三种最常见的对话框 [javascript] view plaincopy //=...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HandlerMethodArgumentResolver 自定义封装参数bean
举报原因:
原因补充:

(最多只允许输入30个字)