實現自定義的引數解析器——HandlerMethodArgumentResolver
阿新 • • 發佈:2019-12-01
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.效果:
直接可以獲取到我們自定返回的物件。
&n