
摘要
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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。