我们都知道SpringMvc的Controller的方法上可以接收各种各样的参数,比如**HttpServletRequest或HttpServletResponse*,各种注解@RequestParam、@RequestHeader、
@RequestBody、@PathVariable、@ModelAttribute,这些参数是从哪里获取的?
这些参数都是由不同的参数解析器为我们解析出来的,可以解析类也可以解析带注解的类
- 我们可以利用解析器解析自定义的参数(类、注解),在我们需要的传入的controller方法上传入它(不需要每次都要在方法内部通过request、response等参数做一系列操作来获取该类对象)
- 我们想要自定义解析参数的时候我们就需要通过更改SpringBoot的配置来添加自己实现的解析类
自定义配置类实现WebMvcConfigurer接口,重写其中的addArgumentResolvers方法来添加自己的解析类(通过自动注入的方法注入)
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List resolvers) {
resolvers.add(userArgumentResolver);
}
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List resolvers) {
resolvers.add(userArgumentResolver);
}
//放行资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
//他为true,才会执行下面的方法,否则不执行
@Override
public boolean supportsParameter(MethodParameter parameter) {
Class> clazz = parameter.getParameterType();
return clazz== User.class;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
String ticket = cookieUtil.getcookievalue(request, "userTicket");
if(StringUtils.isEmpty(ticket)){
return null;
}
return userService.getUserBycookie(ticket,request,response);
}
}
解析对象的使用到此,一个自定义参数解析器就实现好了,我们可以通过传入参数的形式直接通过解析器帮我们获取到
- 我们在controller方法中传入该参数,可以直接为我们获取到User对象
@RequestMapping("/to_list")
public String toList(Model model,User user){
System.out.println(user);
}



