美文网首页
使用WebMvcConfigurer配置SpringMVC

使用WebMvcConfigurer配置SpringMVC

作者: 土豆了解一下 | 来源:发表于2018-02-20 14:35 被阅读0次
    摘要

    Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置。而且Spring还提供了WebMvcConfigurerAdapter让我们更加优化的去进行配置。我们的配置类可以直接继承WebMvcConfigurerAdapter来进行配置

    configurePathMatch:匹配路由请求规则

    • setUseSuffixPatternMatch : 设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认为true
    • setUseTrailingSlashMatch : 设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认为true
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
        /*
         * 1.ServletMappings 设置的是 "/" 2.setUseSuffixPatternMatch默认设置为true,
         * 那么,"/user" 就会匹配 "/user.*",也就是说,"/user.html" 的请求会被 "/user" 的 Controller所拦截.
         * 3.如果该值为false,则不匹配
         */
        configurer.setUseSuffixPatternMatch(false);
    
        /*
         * setUseTrailingSlashMatch的默认值为true
         * 也就是说, "/user" 和 "/user/" 都会匹配到 "/user"的Controller
         */
        configurer.setUseTrailingSlashMatch(true);
    }
    

    addFormatters:注册自定义的Formatter和Convert

    @Bean
    public EnumConverterFactory enumConverterFactory() {
        return new EnumConverterFactory();
    }
    
    /**
     * 注册自定义的Formatter和Convert,例如, 对于日期类型,枚举类型的转化.
     * 不过对于日期类型,使用更多的是使用
     *
     * @DateTimeFormat(pattern = "yyyy-MM-dd")
     * private Date createTime;
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        super.addFormatters(registry);
        registry.addConverterFactory(enumConverterFactory());
    }
    
    /**
     * SpringMVC支持绑定枚举值参数。
     * 匹配规则 :
     * 字符串则尝试根据Enum#name()转换。
     * 如果找不到匹配的则返回null
     */
    public class EnumConverterFactory implements ConverterFactory<String, Enum> {
        
        @Override
        public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
            return new String2EnumConverter(targetType);
        }
    
        class String2EnumConverter<T extends Enum<T>> implements Converter<String, T> {
    
            private Class<T> enumType;
    
            private String2EnumConverter(Class<T> enumType) {
                this.enumType = enumType;
            }
    
            @Override
            public T convert(String source) {
                if (source != null && !source.isEmpty()) {
                    try {
                        return Enum.valueOf(enumType, source);
                    } catch (Exception e) {
                    }
                }
                return null;
            }
        }
    }
    

    addArgumentResolvers:添加自定义方法参数处理器

    需求:想要在Controller的参数列表中注入当前回话的自定义PlatformSession对象。

    @Getter
    @Setter
    public class PlatformSession<T> {
        private T id;
        private String username;
        private int expireTime;
    }
    

    解决方法:创建自定义参数处理器,通过addArgumentResolvers添加到SpringMVC中。

    自定义参数处理器

    public class PlatformSessionArgumentResolvers implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter methodParameter) {
            return PlatformSession.class.equals(methodParameter.getClass());
        }
    
        @Override
        public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
            HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
            return PlatformSessionUtil.getSession(request);
        }
    }
    

    配置类

    @Bean
    PlatformSessionArgumentResolvers platformSessionArgumentResolvers() {
        return new PlatformSessionArgumentResolvers();
    }
    
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(platformSessionArgumentResolvers());
    }
    

    addViewControllers:添加自定义视图控制器

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        // 对 "/hello" 的 请求 redirect 到 "/home"
        registry.addRedirectViewController("/hello", "/home");
        // 对 "/admin/**" 的请求 返回 404 的 http 状态
        registry.addStatusController("/admin/**", HttpStatus.NOT_FOUND);
        // 将 "/home" 的 请求响应为返回 "home" 的视图 
        registry.addViewController("/home").setViewName("home");
    }
    

    addResourceHandlers:添加静态资源处理器

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        // 通过 "/home.html" 请求, 来访问 /resource/static/home.html 静态资源
        registry.addResourceHandler("/home.html").addResourceLocations("classpath:/static/home.html");
    }
    

    相关文章

      网友评论

          本文标题:使用WebMvcConfigurer配置SpringMVC

          本文链接:https://www.haomeiwen.com/subject/hbdgtftx.html