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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM