1. 程式人生 > 其它 >使用 HandlerMethodArgumentResolver 自定義處理Controller中接收引數

使用 HandlerMethodArgumentResolver 自定義處理Controller中接收引數

使用 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