作為一個后端開發,能友好兼容前端參數傳入錯誤等問題,在前端發布不小心多傳一個參數導致系統錯誤的問題,一個廣告系統是零容忍的,所以為了不犯錯誤,后端接收參數必須摒棄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默認的注入參數