关闭

HandlerMethodArgumentResolver 自定义封装参数bean

517人阅读 评论(0) 收藏 举报
分类:

小生最近写代码遇到一个小问题,一个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.     }  

   
    这样代码就优雅多了!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1422581次
    • 积分:21833
    • 等级:
    • 排名:第332名
    • 原创:470篇
    • 转载:1953篇
    • 译文:3篇
    • 评论:69条
    文章分类
    最新评论
    博客推荐
    http://www.vpser.net/