Как установить для spring.main.allow-bean-definition-overriding значение true в начальной конфигурации Spring boot 2.1.0 - PullRequest
0 голосов
/ 23 ноября 2018

Я поддерживаю spring-boot-starter, который настраивает атрибуты ошибок, возвращаемые, например, при вызове неизвестной конечной точки.Это делается путем переопределения bean-компонента org.springframework.boot.web.servlet.error.ErrorAttributes.

Все работает нормально с 2.0.6, но 2.1.0 отключает переопределение бина по умолчанию из-за того, что стартер теперь не работает со следующим сообщением.

Недопустимое определение компонента с именем 'errorAttributes', определенным в ресурсе пути к классу [com / mycompany / springboot / starter / config / ErrorsConfig.class]: Cannotзарегистрировать определение bean-компонента [Root-bean: class [null];Объем =;абстрактные = ложь;lazyInit = ложь;autowireMode = 3;dependencyCheck = 0;autowireCandidate = TRUE;первичные = ложь;factoryBeanName = com.mycompany.springboot.starter.config.ErrorsConfig;factoryMethodName = errorAttributes;initMethodName = NULL;destroyMethodName = (вывод);определено в ресурсе пути к классу [com / mycompany / springboot / starter / config / ErrorsConfig.class]] для компонента bean 'errorAttributes': уже существует [bean bean: class [null];Объем =;абстрактные = ложь;lazyInit = ложь;autowireMode = 3;dependencyCheck = 0;autowireCandidate = TRUE;первичные = ложь;factoryBeanName = org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;factoryMethodName = errorAttributes;initMethodName = NULL;destroyMethodName = (вывод);определяется в ресурсе пути к классу [org / springframework / boot / autoconfigure / web / servlet / error / ErrorMvcAutoConfiguration.class]] bound

Как объяснено в документации, настройка параметра spring.main.allow-bean-definitionПереопределение свойства в true устраняет проблему.У меня вопрос, как это сделать в стартере (я не хочу, чтобы пользователи моего стартера должны были изменять свой файл application.properties для чего-то, что специфично для моего стартера)?

Я попытался аннотации @PropertySource ("classpath: /com/mycompany/starter/application.properties") к моей @Configuration с этим свойством, определенным в этом файле, но он не работает.

Что мне не хватает?Можно ли как-то разрешить моей конфигурации переопределить этот bean-компонент?

Вот (упрощенный) исходный код конфигурации:

@Configuration
@PropertySource("classpath:/com/mycompany/starter/application.properties")
public class ErrorsConfig {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Bean
    public ErrorAttributes errorAttributes() {
        return new DefaultErrorAttributes() {
            @SuppressWarnings("unchecked")
            @Override
            public Map<String, Object> getErrorAttributes(WebRequest request, boolean includeStackTrace) {
                Map<String, Object> errorAttributes = super.getErrorAttributes(request, includeStackTrace);
                // CustomeError is a (simplified) bean of the error attributes we should return.
                CustomError err = new CustomError("myErrorCode", (String) errorAttributes.get("error"));
                return OBJECT_MAPPER.convertValue(err, Map.class);
            }
        };
    }
}

и мой файл ресурсов com / mycompany / starter / application.properties содержит

spring.main.allow-bean-definition-overriding = true

1 Ответ

0 голосов
/ 23 ноября 2018

Bean ErrorAttributes Spring Boot определяется как ErrorMvcAutoConfiguration.Он помечен @ConditionalOnMissingBean, поэтому он будет отменен, если бин ErrorAttributes уже был определен.Поскольку компонент, определенный вашим классом ErrorsConfig, пытается переопределить компонент ErrorAttributes в Boot, а не заставляет его откатываться, ваш класс ErrorsConfig должен обрабатываться после класса ErrorMvcAutoConfiguration в Boot.Это означает, что у вас возникла проблема с упорядочением.

Порядок обработки классов автоконфигурации можно контролировать с помощью @AutoConfigureBefore и @AutoConfigureAfter.Предполагая, что ErrorsConfig сам по себе является классом автоконфигурации, зарегистрированным в spring.factories, вы можете исправить свою проблему, пометив его с помощью @AutoConfigureBefore(ErrorMvcAutoConfiguration.class).С этим изменением ErrorsConfig определит свой bean-компонент ErrorAttributes до того, как ErrorMvcAutoConfiguration попытается это сделать, что приведет к автоматическому конфигурированию ErrorsAttribute bean-компонента Boot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...