Как использовать WebMvcConfigurationSupport из собственной автоконфигурации

Я хотел бы добавить Converterчерез FormattingConversionService, что требует наличия расширения класса @Configuration WebMvcConfigurationSupport:

@Configuration
public class WebAutoConfig extends WebMvcConfigurationSupport {

    @Override
    public FormattingConversionService mvcConversionService() {

        FormattingConversionService fcs = super.mvcConversionService();

        // add Enum converter in order to accept enums
        // case insensitively over Rest:
        fcs.addConverter(
                String.class,
                MyEnum.class,
                new EnumCaseInsensitiveConverter<>( MyEnum.class )
        );

        return fcs;
    }
}

Он прекрасно работает, когда @Configuration используется непосредственно из проекта, но есть необходимость добавить эту логику в нашу собственную boot-starter поэтому не было бы необходимости дублировать код во всех проектах.

Проблема в том, что когда @Configuration переносится в начальный проект, то

  • mvcConversionService() не выполняется, и
  • Маршрутизация RestControllers нарушена (т.е. никакие запросы не отображаются правильно).

Как подойти к этому? Примечание с помощью WebMvcConfigurationSupport это не жесткое требование. Как видно из выдержки из кода, конечная цель состоит в том, чтобы сконфигурировать определенные перечисления, чтобы они принимались без учета регистра остальными контроллерами.

Редактировать: следует добавить, что проект автоконфигурации настроен правильно, как и другие @Configuration классы в том же пакете, что и WebAutoConfig.java выполняем. Думаю, что проблема связана с расширением классов конфигурации WebMvcConfigurationSupport (или же WebMvcConfigurerAdapter в этом отношении) обрабатываются из автоконфигов.

Edit2: единственный способ, которым мне удалось получить работу, - это расширение класса config из проекта using:

import myautoconfproject.autoconfigure.WebAutoConfiguration;

@Configuration
public class WebConfiguration extends WebAutoConfiguration {
}

Но это больше не автоматическая конфигурация.

2 ответа

Решение

Видимо я ошибался насчет WebMvcConfigurerAdapter - тот подхватывается автоконфигурацией:

@Configuration
public class WebAutoConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters( final FormatterRegistry registry ) {

        registry.addConverter(
                String.class,
                MyEnum.class,
                new EnumCaseInsensitiveConverter<>( MyEnum.class )
        );
    }
}

Чтобы ваша конфигурация автоматически подбиралась для проектов, включающих ваш проект в качестве зависимости, вам нужно добавить файл META-INF/spring.factories в ваш classpath (в проекте, где WebAutoConfig ложь и добавить строки

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
your.package.WebAutoConfig
Другие вопросы по тегам