• HandlerMethodArgumentResolver完美解决 springmvc注入参数多传报错


    作为一个后端开发,能友好兼容前端参数传入错误等问题,在前端发布不小心多传一个参数导致系统错误的问题,一个广告系统是零容忍的,所以为了不犯错误,后端接收参数必须摒弃spring 的自动注入@RequestBody,

    1、那么我们就要自定义解析器重写HandlerMethodArgumentResolver的两个方法

    package com.qlkj.jgt.flow.app.resolver;
    
    import com.alibaba.fastjson.JSONObject;
    import com.fqgj.jkzj.common.base.BaseSO;
    import com.fqgj.jkzj.common.base.BaseVO;
    import org.apache.commons.io.IOUtils;
    import org.springframework.core.MethodParameter;
    import org.springframework.web.bind.support.WebDataBinderFactory;
    import org.springframework.web.context.request.NativeWebRequest;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.method.support.ModelAndViewContainer;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    /**
     * @author vampire
     * @date 2019/3/28 4:41 PM
     */
    public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter methodParameter) {
            Class paramObjClass = methodParameter.getParameterType();
    //这里我定义的是如果入参为继承基类的时候就进入这个自定义参数解析方法中
    if (BaseSO.class.isAssignableFrom(paramObjClass)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { Class paramObjClass = parameter.getParameterType(); String json = getRequestBody(webRequest); Object paramObj = paramObjClass.newInstance(); Object object = JSONObject.parseObject(json, paramObjClass); return object != null ? object : paramObj; } private String getRequestBody(NativeWebRequest webRequest) { HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); String jsonBody = (String) webRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST); if (jsonBody == null) { try { jsonBody = IOUtils.toString(servletRequest.getInputStream()); webRequest.setAttribute("params", jsonBody, NativeWebRequest.SCOPE_REQUEST); } catch (IOException e) { throw new RuntimeException(e); } } return jsonBody; } }

    2、xml加入我们的自定义解析器

       <mvc:annotation-driven>
            <mvc:argument-resolvers>
                <bean class="com.qlkj.jgt.flow.app.resolver.CustomArgumentResolver"/>
            </mvc:argument-resolvers>
     </mvc:annotation-driven>

    3、入参是要注意  入参前不能添加 @RequestBody  否则走的是spring默认的注入参数

  • 相关阅读:
    Kettle进行数据迁移(ETL)
    Visual Studio常用快捷键
    RESTful API 设计指南
    理解RESTful架构
    LINQ for XML简单示例
    .NET导入导出Excel方法总结
    AJAX + WebService 实现文件上传
    GitHub使用教程
    .NET读取Excel数据,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
    ASP.NET 操作Excel中的DCOM配置方式
  • 原文地址:https://www.cnblogs.com/likun10579/p/10969503.html
Copyright © 2020-2023  润新知