数据流动之实现自定义MVC自动填充参数

简介:

  在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对象。

参考:https://blog.csdn.net/liujun03/article/details/82779358

 

posted on 2020-04-01 22:50  hello,bdiskl  阅读(489)  评论(0编辑  收藏  举报

导航