Я поддерживаю 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