我维护了一个SpringBootStarter,用于定制在调用未知端点时返回的错误属性。这是通过覆盖org.springframework.boot.web.servlet.error来实现的。ErrorAttributes bean。
在2.0.6中一切正常,但2.1.0 disables bean overriding by default,使启动器现在失败,并显示以下消息。
类路径资源[com/mycompany/springboot/starter/config/ErrorsConfig.class]中定义的名为“errorAttributes”的bean定义无效:无法注册bean定义[Root bean:class[null];范围=;抽象=假;lazyInit=false;autowireMode=3;dependencyCheck=0;autowireCandidate=true;主=假;factoryBeanName=com.mycompany.springboot.starter.config。错误配置;factoryMethodName=errorAttributes;initMethodName=null;destroyMethodName=(推断);在类路径资源[com/mycompany/springboot/starter/config/ErrorsConfig.class]]中为bean“errorAttributes”定义:已经存在[Root bean:class[null];范围=;抽象=假;lazyInit=false;autowireMode=3;dependencyCheck=0;autowireCandidate=true;主=假;factoryBeanName=org.springframework.boot.autoconfigure.web.servlet.error。错误MVCAUTO配置;factoryMethodName=errorAttributes;initMethodName=null;destroyMethodName=(推断);在类路径资源[org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.class]]中定义,绑定
如设置spring.main的文档中所述。允许bean定义重写属性为true修复了该问题。我的问题是如何在starter中执行(我不希望starter的用户必须更改他们的application.properties文件,因为某些特定于我的starter)?
我尝试使用该文件中定义的属性对我的@Configuration进行@PropertySource(“classpath:/com/mycompany/starter/application.properties”)注解,但不起作用。
我错过了什么?是否有任何方法允许我的配置覆盖该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。属性包含
spring.main.allowbean定义覆盖=true
2条答案
按热度按时间njthzxwz1#
Spring Boot的
ErrorAttributes
bean由ErrorMvcAutoConfiguration
定义。它用@ConditionalOnMissingBean
注解,因此如果已经定义了ErrorAttributes
bean,它将后退。由于ErrorsConfig
类定义的bean试图覆盖引导的ErrorAttributes
bean,而不是使其退出,因此ErrorsConfig
类必须在启动的ErrorMvcAutoConfiguration
类之后进行处理。这意味着您的启动器中存在订购问题。可以使用
@AutoConfigureBefore
和@AutoConfigureAfter
控制自动配置类的处理顺序。假设ErrorsConfig
本身是在spring.factories
中注册的自动配置类,您可以通过使用@AutoConfigureBefore(ErrorMvcAutoConfiguration.class)
对其进行注解来解决问题。此更改到位后,ErrorsConfig
将在ErrorMvcAutoConfiguration
尝试定义其ErrorAttributes
bean之前定义该bean,这将导致引导的ErrorsAttribute
bean的自动配置退出。ddhy6vgd2#
更简单的解决方案是将此属性
spring.main.allow-bean-definition-overriding=true
添加到application.properties
中。参考