HandlerMethodArgumentResolver 自定义封装参数bean

小生最近写代码遇到一个小问题,一个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值