Spring參數解析器HandlerMethodArgumentResolver


一、引入Why

1. @RequestBody注解,可以把請求里的參數,自動映射到方法里的參數

2. 如果方法里的參數,不只是請求里的參數,還有cookie里的數據,消息頭的數據

3. 並且希望Controller的接口仍然接受一個參數對象,參數已經組裝好了

4. 這時候需要HandlerMethodArgumentResolver接口

 

二、概念What

HandlerMethodArgumentResolver是一個接口,包含兩個方法

public interface HandlerMethodArgumentResolver {
// 條件,當返回值為true時,才調用resolveArgument()方法
boolean supportsParameter(MethodParameter var1);
// @Nullable Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4)
throws Exception; } 

 

三、用法How

1. 創建參數解析器類,實現HandlerMethodArgumentResolver接口,重寫接口的兩個方法

public class DefArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //方法參數是User 則使用此解析器
        return User.class.isAssignableFrom(methodParameter.getParameterType());
    }

    @Override
    public Object resolveArgument(
            MethodParameter methodParameter,
            @Nullable ModelAndViewContainer modelAndViewContainer,
            NativeWebRequest nativeWebRequest,
            @Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
// 獲取請求 HttpServletRequest servletRequest
= nativeWebRequest.getNativeRequest(HttpServletRequest.class); String info = (String) nativeWebRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST); //獲取消息頭認證信息,沒有后續操作了,根據業務實際來解析校驗該token String token = servletRequest.getHeader("Authorization"); //自己塞數據進去,也可以從配置文件獲取數據 return new User("zhangsan",18); } }

2. 添加自定義的解析器到解析器集合,類似攔截器

@Component
//一定要將自己的擴展類加到容器中
public class DefWebMvcConfigurer implements WebMvcConfigurer {

    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new DefArgumentResolver());
    }
}

3. 在Controller里獲取到封裝好的參數對象

@RestController
public class Controller {

    @GetMapping("/test")
    public String test(User user){
        return user.toString();
    }
}

 

 

 

參考:

http://www.likecs.com/show-83637.html

https://my.oschina.net/u/3195939/blog/4707620

https://blog.csdn.net/songzehao/article/details/99641594


免責聲明!

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



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