java spring HandlerMethodArgumentResolver 自定义接收各种类型参数

24 篇文章 0 订阅
8 篇文章 0 订阅

spring 自带@requestParam @requestBody注解可以很方便将参数填充到相应的实体类,但是应用场景不同。其实本质还是由于不同的Content-type ,传输方式不同。

平常请求contentType 一般为 "application/x-www-form-urlencoded"

提交json类型一般都需要设置 application/json

有个需求需要把请求参数都收集起来,故需要自己开发判断多种类型。可以结合 HandlerMethodArgumentResolver 声明个自定义注解支持多种方式。HandlerMethodArgumentResolver demo可参考https://blog.csdn.net/xuyw10000/article/details/89514754

获取参数代码如下


@Slf4j
public class MyRequestParamMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(MyRequestParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
        JSONObject req = getReqParam(servletRequest);
        Class cla = parameter.getParameterType();
        return JSON.parseObject(req, cla);
    }
    public  JSONObject getReqParam(HttpServletRequest request) {
        String contentType = request.getHeader("Content-Type");
        if (StringUtils.isBlank(contentType)) {
            contentType = "application/x-www-form-urlencoded";
        }
        contentType=contentType.toLowerCase();
        if (contentType.startsWith("application/json")) {
            try {
                String json = IOUtils.toString(request.getInputStream(), "utf-8");
                return JSON.parseObject(json, Feature.OrderedField);
            } catch (Exception e) {
                log.error("获取参数异常", e);
                return null;
            }
        }
        if (contentType.startsWith("application/x-www-form-urlencoded")) {
            return getDataForParameterMap(request);
        }
        if (contentType.startsWith("multipart/form-data")) {
            MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
            MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
            return getDataForParameterMap(multipartRequest);
        }
        return getDataForParameterMap(request);
    }

    public  JSONObject getDataForParameterMap(HttpServletRequest request) {
        Map<String, String[]> parameterMap = request.getParameterMap();
        JSONObject jsonObject = new JSONObject();
        if (parameterMap == null || parameterMap.size() == 0) {
            return jsonObject;
        }
        for (Map.Entry<String, String[]> m : parameterMap.entrySet()) {
            String[] values = m.getValue();
            if (values.length > 1) {
                jsonObject.put(m.getKey(), values);
            } else {
                jsonObject.put(m.getKey(), values[0]);
            }

        }
        return jsonObject;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值