一、前言

Sprinboot中配置SpringMVC主要是继承WebMvcConfigurerAdapter(1.x版本)或者WebMvcConfigurationSupport(2.x版本)。这次主要介绍下web应用的一些常用配置。

二、开始配置

(一)配置参数解析器

参数解析器的作用,通俗来说,参数解析器的作用是将请求中的参数字映射到我们Controller方法参数,比如说通过参数解析器,我们可以将前端传过来的token参数做一下处理,从redis中取出用户信息,直接映射为一个userInfo对象,然后Controller方法的参数就直接是UserInfo类型的对象就可以了。如何使用勒?下面是一个简单范例,这里只贴出伪代码:

首先我们创建一个解析器类,并且实现HandlerMethodArgumentResolver接口。

public class TokenHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    private RedissonClient redissonClient;
    private UserDao userDao;
    public TokenHandlerMethodArgumentResolver(RedisClient redisClient, UserDao userDao) {
        this.redissonClient = redisClient;
        this.userDao = userDao;
    }
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return User.class.isAssignableFrom(methodParameter.getParameterType());
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception{
        HttpServletRequest nativeRequest = (HttpServletRequest) nativeWebRequest.getNativeRequest();
        String token = nativeRequest.getHeader("token");
        RBucket<String> userIdBucket = redissonClient.getBucket(token);
        if(StringUtils.isNotBlank(userIdBucket.get())){
            User user = userDao.getById(userIdBucket.get());
        }
        return user;
    }
}

然后创建类MyWebConfig,继承WebMvcConfigurationSupport并实现ApplicationContextAware接口,为什么实现ApplicationContextAware,是为了从IOC容器当中取出redissonClient和userDao,用于构造TokenHandlerMethodArgumentResolver。

public class MyWebConfig extends WebMvcConfigurationSupport implements ApplicationContextAware {
    private UserDao userDao;
    private RedissonClient redissonClient;
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
       argumentResolvers.add(new TokenHandlerMethodArgumentResolver(redissonClient,userDao));
        super.addArgumentResolvers(argumentResolvers);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        userDao = applicationContext.getBean(UserDao.class);
        redissonClient = applicationContext.getBean(RedissonClient.class);
    }
}

如上,HandlerMethodArgumentResolver最重要的两个方法是boolean supportsParameter(MethodParameter methodParameter)Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory),前者是如果返回ture表示使用该解析器进行解析,后者就是返回处理后的方法参数。另外例子中比较关键的方法有通过NativeWebRequest获取HttpServletRequest的方法 nativeWebRequest.getNativeRequest()。

这里的逻辑是,如果参数中有参数的类型是User类型,那么直接通过token去获取注入在这里。对于我们来说,如果需要用户信息就只需要在Controller中加个User参数,就自动有了,不需要自己查,就可以很方便的引用用户的相关信息。

参数解析器的意义:

睡觉,还有很多得写,明天继续

10-12 15:32