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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。