springmvc对请求参数进行预处理HandlerMethodArgumentResolver


    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return true;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
        WebDataBinderFactory webDataBinderFactory) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        HttpServletRequest httpServletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);

        // 处理get请求
        if ("GET".equals(httpServletRequest.getMethod())) {
            return getRequestHandle(methodParameter, nativeWebRequest);
        }

        return postRequestHandle(methodParameter, nativeWebRequest);
    }

    /**
     * 处理get请求
     */
    private Object getRequestHandle(MethodParameter methodParameter, NativeWebRequest nativeWebRequest)
        throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<?> parameterType = methodParameter.getParameterType();
        String parameter = nativeWebRequest.getParameter(methodParameter.getParameterName());

        if (parameterType == String.class) {
            return parameter;
        }

        if (parameterType.isPrimitive()) {
            return JSON.parseObject(parameter, parameterType);
        }

        Object instance = parameterType.newInstance();
        Iterator<String> parameterNames = nativeWebRequest.getParameterNames();
        while (parameterNames.hasNext()) {
            String attrName = parameterNames.next();
            String attrValue = nativeWebRequest.getParameter(attrName);
            Class attrType = getAttrClassType(parameterType, attrName);
            Method setterMethod = parameterType.getMethod(getSetterName(attrName), attrType);

            if (attrType.isPrimitive()) {
                setterMethod.invoke(instance, JSON.parseObject(attrValue, attrType));
                continue;
            }
            setterMethod.invoke(instance, attrValue);
        }

        return instance;
    }

    /**
     * 处理宝武基座转发的请求
     */
    private Object postRequestHandle(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) {
        // 宝武基座转发数据从data中获取
        String data = nativeWebRequest.getParameter("data");
        // 得到参数的类型
        Class<?> parameterType = methodParameter.getParameterType();
        // 基本数据类型
        if (parameterType.isPrimitive() || parameterType == String.class) {
            JSONObject jsonObject = JSON.parseObject(data);
            String parameterName = methodParameter.getParameterName();
            Object parameterValue = jsonObject.get(parameterName);

            if (parameterValue == null) {
                log.error("参数丢失, 缺少->" + parameterName + "参数。完整请求数据->" + data);
            }

            return parameterValue;
            // 包装类
        } else {
            return JSON.parseObject(data, parameterType);
        }
    }

    /**
     * 根据参数名称获取set方法名
     */
    private String getSetterName(String attrName) {
        String firstLetter = attrName.substring(0, 1);
        firstLetter = firstLetter.toUpperCase();

        return "set" + firstLetter + attrName.substring(1, attrName.length());
    }

    /**
     * 获取类中某个属性的类型
     */
    private Class getAttrClassType(Class classType, String attrName) {
        Field[] fields = classType.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            if (field.getName().equals(attrName)) {
                return field.getType();
            }
        }

        log.error("类->" + classType.getName() + "中没有名称为->" + attrName + "的属性");
        return null;
    }

上面实现的功能是:当请求方式为post请求时,将body里的请求参数进行解体;

请求数据格式:

解析后传入控制层方法时的数据格式:dataItem:CWS2_LargePool

相当于去掉了data这一层

 

list类型时:"list":["a","b","c"]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值