使用 HandlerMethodArgumentResolver 自定義處理Controller中接收引數
阿新 • • 發佈:2022-01-19
使用 HandlerMethodArgumentResolver 自定義處理Controller中接收引數
一、
1、配置類中加 自定引數解析器
/** * 註冊外部的interceptor WebConfig */ @Configuration public class WebConfig implements WebMvcConfigurer { /** * 配置外部HandlerMethodArgumentResolver */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new HandleFirstArgsRevlover()); } }
2、 使用自定義引數解析器,先判斷引數中包含如果 UserInfo型別引數時會執行 resolveArgument,並返回處理後的引數如action
/** * 儲存使用者資訊 * @param userInfo * @param role * @return */ @RequestMapping("saveUser") public Result saveUserInfo(com.hualala.order.common.Common.UserInfo userInfo, Role role){ System.out.println("userInfo = " + userInfo); return new Result(); }
當saveUserinfo執行時,所有預設解析器和自定義解析器會遍歷每個引數,如遍歷到符合HandleFirstArgsRevlover會進行處理(每個引數會進行引數解析器遍歷匹配),如果supportsParameter返回ture符合會執行resolveArgument並返回處理後的引數物件
public class HandleFirstArgsRevlover implements HandlerMethodArgumentResolver { /** * 驗證引數是否滿足,返回 true: 執行resolveArgument , fasle:不執行執行resolveArgument * @param parameter * @return */ @Override public boolean supportsParameter(MethodParameter parameter) { Class<?> paraType = parameter.getParameterType(); return null == paraType.getAnnotationsByType(RequestBody.class) && UserInfo.class.equals(paraType); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request=webRequest.getNativeRequest(HttpServletRequest.class); String userId= request.getParameter("id"); if(StringUtils.isNotBlank(userId)){ UserInfo userInfo=new UserInfo(); userInfo.setId(userId); userInfo.setUserName("firstName"); userInfo.setLoginId("152013303300"); return userInfo; } return null; } }
ps:注意有使用 @RequestBody和其它**註解的引數,自定義引數解析器不執行,因為spring針對引數解析器有些預設的解析器,當遇到這些預設解析器會優先執行,並不在執行後續自定義解析器
二、可以使用自定義註解 用於標示哪些引數需要解析處理
參照:https://blog.csdn.net/u010675669/article/details/91501599