参数解析器的使用
一、前言
在使用spring-web的时候,我们获取HttpServletRequest中的数据时候通常会会用到@Header @RequestParam @RequestBody等注解获取值,并注入到对应的变量中。那么这个到底是怎么实现呢? 二、参数解析器的基本使用2.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 CurrentUser { } 2.2 创建参数解析器 import com.ztq.anno.CurrentUser; import com.ztq.vo.User; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; 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 java.util.Objects; @Slf4j public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { if (parameter.getParameterType().equals(User.class) && parameter.hasParameterAnnotation(CurrentUser.class)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String name = webRequest.getParameter("name"); User user = new User(); user.setUserName(Objects.isNull(name)?"test1":name); user.setPassword("password"); return user; } } 2.3 创建配置类,添加参数解析器 import com.ztq.resolver.CurrentUserMethodArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class MvcConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List resolvers) { resolvers.add(new CurrentUserMethodArgumentResolver()); } } 2.4 测试 import com.ztq.anno.CurrentUser; import com.ztq.vo.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("user") public class ArgsController { @GetMapping public User getUserInfo(@CurrentUser User user){ return user ; } } 三、总结
在实际应用中,我们可以根据HandlerMethodArgumentResolver 接口中第二个方法,传递过来的参数webRequest ModelAndView等结合其他的辅助类完成更加复杂的数据类型的注入。