HandlerMethodArgumentResolver
- 第一个方法用来判断是否需要进行参数解析
- 第二个方法返回值就是解析的参数值
方法分析自定义解析器需要实现HandlerMethodArgumentResolver接口,HandlerMethodArgumentResolver接口包含两个接口:package org.springframework.web.method.support;import org.springframework.core.MethodParameter;import org.springframework.web.bind.WebDataBinder;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;/**● Strategy interface for resolving method parameters into argument values in● the context of a given request.●● @author Arjen Poutsma● @since 3.1● @see HandlerMethodReturnValueHandler*/public interface HandlerMethodArgumentResolver {boolean supportsParameter(MethodParameter parameter);Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;}2.1 接口说明:supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。
使用方法3.1 自定义注解import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/**● 登录用户信息*/@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface LoginUser {}
3.2 自定义参数解析器,实现HandlerMethodArgumentResolver接口package io.renren.modules.app.resolver;import io.renren.modules.app.annotation.LoginUser;import io.renren.modules.app.entity.UserEntity;import io.renren.modules.app.interceptor.AuthorizationInterceptor;import io.renren.modules.app.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.MethodParameter;import org.springframework.stereotype.Component;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;/**● 有@LoginUser注解的方法参数,注入当前登录用户*/@Componentpublic class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {@Autowiredprivate UserService userService;@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.getParameterType().isAssignableFrom(UserEntity.class) && parameter.hasParameterAnnotation(LoginUser.class);}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,NativeWebRequest request, WebDataBinderFactory factory) throws Exception {//获取用户IDObject object = request.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST);if(object == null){return null;}//获取用户信息UserEntity user = userService.selectById((Long)object);return user;}}
3.3 注册自定义参数解析器Springboot中使用方法:import java.util.List;/**● MVC配置*/@Configurationpublic class WebMvcConfig extends WebMvcConfigurerAdapter {@Autowiredprivate AuthorizationInterceptor authorizationInterceptor;@Autowiredprivate LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**");}@Overridepublic void addArgumentResolvers(List argumentResolvers) {argumentResolvers.add(loginUserHandlerMethodArgumentResolver);}}3.4 Controller使用自定义注解@GetMapping("info")public UserEntity userInfo(@LoginUser UserEntity user){return user;}。
