webMvcConfigurer的详情

 
 
 
 
 
 
 
摘要

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");
}
作者:土豆了解一下
链接:https://www.jianshu.com/p/52f39b799fbb
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自www.cnblogs.com/cl-rr/p/9632886.html