如何设置spring.main,在Spring boot 2.1.0启动器配置中允许bean定义重写为true

i2byvkas  于 2022-09-19  发布在  Spring
关注(0)|答案(2)|浏览(219)

我维护了一个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

njthzxwz

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的自动配置退出。

ddhy6vgd

ddhy6vgd2#

更简单的解决方案是将此属性spring.main.allow-bean-definition-overriding=true添加到application.properties中。
参考

相关问题