實現自定義的參數解析器——HandlerMethodArgumentResolver


1.為什么需要自己實現參數解析器

我們都知道在有注解的接口方法中加上@RequestBody等注解,springMVC會自動的將消息體等地方的里面參數解析映射到請求的方法參數中。

如果我們想要的信息不完全是來自消息體等地方,比如說一部分是消息體,一部分是消息頭,甚至一部分從配置中獲取。這個時候我們又希望在方法入參進來就將這些信息組裝好。或者說是需要從消息頭里面去進行token解析認證的時候。

2. HandlerMethodArgumentResolver接口

實現HandlerMethodArgumentResolver來擴展自己的參數解析器。該接口有兩個方法supportsParameter和resolveArgument我們需要重寫這兩個方法。

 

 

 

supportsParameter是條件,只有這個方法返回true的時候。才會在調用resolveArgument方法進行參數解析。

Spring源碼中對這兩個方法的調用:

 

 

 

3.實現自己的參數解析器:

 

package com.nijunyang.springboot.argsresolver;

import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
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;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
public class DefArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //方法參數是User 則使用此解析器
        return User.class.isAssignableFrom(methodParameter.getParameterType());
    }

    @Nullable
    @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);


    }
}

 

4.將自己的解析器加入到容器的解析器集合中

package com.nijunyang.springboot.argsresolver;

import org.springframework.stereotype.Component;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
@Component
//一定要將自己的擴展類加到容器中
public class DefWebMvcConfigurer implements WebMvcConfigurer {

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

當然也可以用注解的形式注入到DefWebMvcConfigurer 中在添加到集合中,同時還可以在DefArgumentResolver 中獲取配置的信息。

5.Test

package com.nijunyang.springboot.argsresolver;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
@RestController
public class Controller {

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

6.效果:

 

直接可以獲取到我們自定返回的對象。

 


免責聲明!

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



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