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默認的注入參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM