`

HandlerMethodArgumentResolver 自定义封装参数bean

阅读更多

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

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

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

         
        

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface BrokerRequestArgument {
}

    

public class BrokerRequestResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(BrokerRequestArgument.class) != null;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String token = webRequest.getHeader("X-token");
        LoginUserModel loginUserModel = (LoginUserModel) webRequest.getAttribute(token, RequestAttributes.SCOPE_SESSION);

        Object obj = BeanUtils.instantiate(parameter.getParameterType());
        BeanWrapper wrapper = PropertyAccessorFactory
                .forBeanPropertyAccess(obj);
        Field[] fields = parameter.getParameterType().getDeclaredFields();
        Map<String, Field> fieldMap = Maps.newHashMap();
        for (Field field : fields) {
            fieldMap.put(field.getName(), field);
        }

        for (Iterator<String> paramNames = webRequest.getParameterNames(); paramNames.hasNext(); ) {
            String paramName = paramNames.next();
            Object o = webRequest.getParameter(paramName) ;
            wrapper.setPropertyValue(paramName,o);
        }
        wrapper.setPropertyValue("clientId",loginUserModel.getClientId());
        wrapper.setPropertyValue("password",loginUserModel.getPassword());
        return obj;
    }
}

 

    

<mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="
cn.xxx.xxx.web.resolver.BrokerRequestResolver" lazy-init="false"/>
        </mvc:argument-resolvers>
 </mvc:annotation-driven>

 

    

@RequestMapping(value = "/his_trade_entrusts", method = RequestMethod.GET)
    @ResponseBody
    public String hisEntrustQry(HttpServletRequest request, PagingQueryRequest brokerRequest) {
        setClientIdAndPassword(request,brokerRequest);
        BrokerResponse brokerResponse = guojinTradeService.hisEntrustQry(brokerRequest);
        return pagingResponse(brokerResponse);
    }

//变成了

@RequestMapping(value = "/his_trade_entrusts", method = RequestMethod.GET)
    @ResponseBody
    public String hisEntrustQry( @BrokerRequestArgument PagingQueryRequest brokerRequest) {
        BrokerResponse brokerResponse = guojinTradeService.hisEntrustQry(brokerRequest);
        return pagingResponse(brokerResponse);
    }

   
    这样代码就优雅多了!

分享到:
评论

相关推荐

    wpf 自定义 封装的控件

    以下是对“wpf 自定义 封装的控件”这一主题的详细解释。 1. **控件基础**: - WPF提供了丰富的内置控件,如Button、TextBox、Label等,但它们可能无法满足所有应用场景。 - 自定义控件分为两种类型:`User...

    allegro自定义封装.

    ### Allegro自定义封装制作详解 #### 一、概述 Allegro是一款广泛应用于电子设计自动化领域的软件,尤其在印刷电路板(PCB)设计方面表现突出。自定义封装是Allegro的一项重要功能,它允许用户根据实际需求创建...

    ActionSheet_自定义封装

    6. **示例代码**:提供的“ActionSheet_自定义封装”可能包含一个简单的使用示例,展示了如何创建一个ActionSheet实例,设置参数并展示出来。这对于初学者来说是非常有帮助的,他们可以直接运行这个示例,理解封装后...

    基于鸿洋okhttputils 封装数据 bean和callback 回调

    本主题主要探讨的是如何基于鸿洋的OkHttpUtils进行数据Bean的封装以及Callback回调的处理。 首先,我们来理解一下OkHttpUtils的核心概念。OkHttpUtils提供了一系列静态方法,如`get()`, `post()`等,用于发起HTTP...

    常用的自定义的封装

    而"常用的自定义的封装"这个主题,指的是设计者根据实际需求创建或修改的PCB元件封装模型。封装是PCB设计中的一个重要组成部分,它代表了实际电路板上元器件的物理形状和电气连接方式。 Altium Designer是一款强大...

    C++自定义封装socket操作业务类完整实例

    本实例提供了在Linux环境下实现C++自定义封装socket操作业务类的详细过程,允许开发者轻松地创建socket连接、设置参数以及发送请求。 首先,`SocketConnector` 类是核心业务类,它包含了与socket相关的各种操作。类...

    OC-高度自定义封装tabbar框架

    本文将详细解析"OC-高度自定义封装tabbar框架"这一主题,探讨如何通过Objective-C(OC)对原生TabBar进行自定义封装,以实现更高的灵活性和扩展性,同时保持系统的稳定性和兼容性。 首先,我们要明白原生TabBar的...

    swift-自定义封装轮播图

    "swift-自定义封装轮播图"项目就是这样一个例子,它提供了一种高效、灵活的方式来展示图片轮播效果。在这个项目中,开发者创建了一个自定义的轮播图控件,可以满足无限轮播和普通轮播的需求,同时还有自定义的...

    Halcon 3D 平面度 自定义封装函数

    参数: 深度图:ImageH (input_object) 平面度测量区域:RoiMeasure (input_object) 低尾去除噪点参数:LowFilterRate (input_control) 高尾去除噪点参数:HighFilterRate (input_control) 平面度最小值:...

    蓝牙自定义封装

    "蓝牙自定义封装"是一种为了简化开发者工作,提高效率的方法。通过自定义封装,开发者可以避免直接处理蓝牙低能耗(BLE,Bluetooth Low Energy)的复杂性,比如苹果提供的Core Bluetooth框架中涉及的大量协议和操作...

    swift-自定义封装UITableView和MJRefresh相结合

    本文将深入探讨如何在Swift中自定义封装`UITableView`与`MJRefresh`,以创建一个高效、灵活且易于维护的列表视图。 首先,我们从`UITableView`的自定义封装开始。自定义封装`UITableView`的主要目标是将复杂的表格...

    基于c#自定义封装控件(IP地址填写控件)

    为了提高用户体验和界面的一致性,开发者会自定义封装控件。在这个场景下,"基于C#自定义封装控件(IP地址填写控件)"的实践是为了创建一个专门用于输入IP地址的用户界面元素。 自定义控件是.NET框架中的一个重要...

    Protel 99 自定义封装教程

    Protel 99se学习自定义PCB的封装

    PCB图设计自定义封装PPT教案.pptx

    PCB图设计自定义封装PPT教案.pptx

    Unity自定义封装Debug类

    自定义调试类,更加便捷的使发布后的程序,直接在主界面观看所自行输出的Log;右下角可一键清理输出内容,也可一键 开启/关闭 log滚动查看。开启可通过修改 常量:isOpenTheDebug = ture ,轻松便捷。解决了以往自行...

    跟学STM32江科大教程,自定义封装库

    跟学STM32江科大教程,自定义封装库

    案例实战-SpringBoot3.x自定义封装starter实战

    在本案例实战中,我们将深入探讨如何在Spring Boot 3.x框架中自定义并封装一个starter。Spring Boot的starter是其核心特性之一,它提供了一种便捷的方式来配置和使用各种功能模块,使得开发者可以快速搭建应用。理解...

    C#.NET 封装自定义组件(控件)Dll

    本主题将详细探讨如何使用C#.NET来封装自定义组件,并通过一个自定义数字文本框的实例进行说明。 首先,创建自定义控件的过程通常包括以下步骤: 1. **定义类**:在C#中,我们需要创建一个新的类,这个类将继承自...

    C#绘制曲线自定义封装

    本篇文章将详细讲解如何利用C#实现曲线的自定义封装,包括封装绘制曲线的类、数据输入处理以及图形界面的交互。 首先,我们需要创建一个专门用于绘制曲线的类。这个类通常包含以下几个核心组件: 1. **绘图面板**...

    JavaFx 自定义封装 Pagination 分页组件、控件

    javaFx 自定义时间选择组件 Pagination, javaFx 源代码分页功能较少,该代码组件支持首页、上一页、下一页、尾页、跳转、每页数量等操作,同时展示总数据量,使用教程搜索博客:《JavaFx 自定义封装 Pagination ...

Global site tag (gtag.js) - Google Analytics