简介:
在Controller中的方法中的参数,有许多为MVC自动进行填充值的如HttpServletRequest,HttpServletResponse等参数,该功能为开发提供了很大的方便。本文自定义一个参数让MVC来填充该参数的值。
注意:WebMvcConfigurerAdapter类在SpringBoot 2.0中被弃用。
步骤一:创建WebConfig.class继承WebMvcConfigurerAdapter类,重写addArgumentResolvers方法
1.spring boot为了方便用户扩展spring MVC的配置,提供了WebMvcConfigurerAdapter类,只要我们实现了WebMvcConfigurerAdapter类
就可以自定义许多的组件;例如,自定义个WebConfig.class就是继承了WebMvcConfigurerAdapter类,在其中使用了addInterceptors()添加了拦截器,
使用addArgumentResolvers()添加了参数解析器。
1.创建WebConfig类并使用@Configuration标注,在spring初始化时就会加载该类。
2.重写addArgumentResolver方法:框架回调该方法,添加一个参数解析器ArgumentResolver。
1 import org.springframework.context.annotation.Configuration; 2 import org.springframework.beans.factory.annotation.Autowired; 3 import org.springframework.web.method.support.HandlerMethodArgumentResolver; 4 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 5 6 @Configuration 7 public class WebConfig extends WebMvcConfigurerAdapter { 8 @Autowired 9 UserArgumentResolver userArgumentResolver; 10 @Override 11 public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 12 argumentResolvers.add(userArgumentResolver); 13 } 14 }
步骤二:创建userArgumentResolver并实现HandlerMethodArgumentResolver接口
1.创建一个参数解析器类作为上面argumentResolvers.add()方法的参数,需要继成HandlerMethodArgumentResolver
2.重写其中的两个方法。
1 import com.alibaba.druid.util.StringUtils; 2 import com.app.miaosha.Pojo.MiaoshaUser; 3 import com.app.miaosha.Service.MiaoshaUserService; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.core.MethodParameter; 6 import org.springframework.stereotype.Service; 7 import org.springframework.web.bind.support.WebDataBinderFactory; 8 import org.springframework.web.context.request.NativeWebRequest; 9 import org.springframework.web.method.support.HandlerMethodArgumentResolver; 10 import org.springframework.web.method.support.ModelAndViewContainer; 11 12 import javax.servlet.http.Cookie; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 @Service 17 public class UserArgumentResolver implements HandlerMethodArgumentResolver { 18 @Autowired 19 MiaoshaUserService miaoshaUserService; 20 @Override 21 //该方法用来判断参数的类型是否为MiaoshaUser,如果此方法返回true,执行resolveArgument方法 22 public boolean supportsParameter(MethodParameter methodParameter) { 23 Class<?> clazz = methodParameter.getParameterType(); 24 return MiaoshaUser.class==clazz; 25 } 26 27 @Override 28 public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { 29 //得到request和response 30 HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest(); 31 HttpServletResponse response = (HttpServletResponse) nativeWebRequest.getNativeResponse(); 32 //得到token 33 String paramToken = request.getParameter(MiaoshaUserService.TOKEN_NAME); 34 String cookieToken = getCookieValue(request,MiaoshaUserService.TOKEN_NAME); 35 //使用cookie得到对象 36 if (StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)) { 37 return "login"; 38 } 39 String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken; //优先取paraToken 40 MiaoshaUser user = miaoshaUserService.getByToken(token,response); 41 return user; 42 } 43 44 private String getCookieValue(HttpServletRequest request, String tokenName) { 45 Cookie[] cookies = request.getCookies(); 46 for (Cookie c:cookies 47 ) { 48 if (c.getName().equals(tokenName)) { 49 return c.getValue(); 50 } 51 } 52 return null; 53 } 54 }
supportsParameter方法:用来判断当前参数是否为我们需要注入值的参数,如果返回true,执行resolveArgument方法。
resolveArgument方法:对参数的值进行注入。
总结
1.框架加载WebConfig.java类,调用其中的addArgumentResolver方法,WebConfig.java继承WebMvcConfigurerAdapter.java可以扩展自定义的各种组件。
2.在addArgumentResolver方法中添加一个自定义的参数解析器userArgumentResolver对象。
3.userArgumentResolver.java继承了HandlerMethodArgumentResolver.interface。
4.在userArgumentResolver中有两个方法;supportsParameter方法判断参数列表中是否有MiaoshaUser参数。如果有执行resolverArgument方法。
5.在resolverArgument方法中执行填充MiaoshaUser参数的工作:先由request中获取token,再通过token由redis中获取MiaoshaUser对象。