欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用WebMvcConfigurer配置SpringMVC

程序员文章站 2022-03-18 16:02:44
...

使用WebMvcConfigurer配置SpringMVC

 

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");
}