Разница между WebMvcConfigurationSupport и WebMvcConfigurerAdapter

Я хотел бы добавить обработчики ресурсов. На форуме они используют WebMvcConfigurationSupport: http://forum.springsource.org/showthread.php?116068-How-to-configure-lt-mvc-resources-gt-mapping-to-take-precedence-over-RequestMapping&p=384066

и документы говорят WebMvcConfigurerAdapter: http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html

Какая разница и какой использовать? У обоих есть addResourceHandlers метод мне нужен.

Это мой текущий класс:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    public @Override void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources");
    }

    public @Bean TilesViewResolver tilesViewResolver() {
        return new TilesViewResolver();
    }

    public @Bean TilesConfigurer tilesConfigurer() {
        TilesConfigurer ret = new TilesConfigurer();
        ret.setDefinitions(new String[] { "classpath:tiles.xml" });
        return ret;
    }
}

3 ответа

Решение

Ответ в документе, на который вы ссылались выше:

Если параметры настройки WebMvcConfigurer не предоставляют что-то, что вам нужно настроить, рассмотрите возможность удаления аннотации @EnableWebMvc и расширения непосредственно из WebMvcConfigurationSupport, переопределяя выбранные методы @Bean

Короче говоря, если @EnableWebMvc работает для вас, нет необходимости искать дальше.

Если вы используете класс ConfigurationSupport, будьте готовы к тяжелой работе, когда пытаетесь обслуживать статические ресурсы, потому что она не работает.

Я недавно решал ту же проблему при настройке конвертеров, и это привело к довольно длинному посту.

По умолчанию Spring Boot использует свою реализацию WebMvcConfigurationSupport и делает много автоматической магии, включая поиск всех WebMvcConfigurerи используя их. Boot уже предоставляет одну реализацию, и вы можете добавить еще. Это приводит к кажущемуся запутанному поведению, когда список конвертеровconfigureMessageConverters в вашей реализации WebMvcConfigurer уже предварительно заполнен из предыдущего конфигуратора.

Эти типы (WebMvcConfigurationSupport а также WebMvcConfigurer) также имеют поразительно похожий интерфейс, но первый НЕ реализует другой. Дело в том:

Класс поддержки ищет конфигураторы и использует их + что-то делает самостоятельно.

Если вы продолжите WebMvcConfigurationSupport вы принимаете конфигурацию, и пока есть некоторые вещи, которых нет в WebMvcConfigurer (подобно addDefaultHttpMessageConverters) также есть масса кода из EnableWebMvcConfiguration а также DelegatingWebMvcConfiguration этого не происходит.

Оба расширения WebMvcConfigurationSupport или WebMvcConfigurer (не уверен, что оба сразу имеют большой смысл) имеют свои допустимые применения, но с расширением класса поддержки вы гораздо больше берете на себя процесс и теряете много "самоуверенных" функций Spring Boot.

Лучше расширить WebMvcConfigurationSupport. Он предоставляет больше возможностей для настройки, а также отлично работает с

configureMessageConverters(List<HttpMessageConverter<?>> converters) 

потому что вы можете добавить эти конвертеры, используя

addDefaultHttpMessageConverters(converters);

это не доступно с WebMvcConfigurerAdapter.

Нажмите [здесь] Как настроить MappingJacksonHttpMessageConverter при использовании конфигурации на основе весенних аннотаций?

Если вы расширяете WebMvcConfigurerAdapter, он ведет себя странно с настройкой Джексона и Jaxb. Это случилось со мной!

Другие вопросы по тегам