当前位置: 首页 > 知识库问答 >
问题:

如何设置Spring。主要的在SpringBoot2.1中允许bean定义重写为true。0启动器配置

越学义
2023-03-14

我维护了一个SpringBootStarter,它定制了在调用未知endpoint时返回的错误属性。这是通过覆盖组织来实现的。springframework。靴子网状物servlet。错误错误属性bean。

2.0.6一切正常,但是2.1.0默认禁用bean重写,使得启动程序现在失败,出现以下消息

在类路径资源[com/mycompany/springboot/starter/config/ErrorsConfig.class]中定义了名称'errorAtinites'的无效bean定义:无法注册bean定义[Root bean: class[null];范围=;摘要=false; lazyInit=false; autowireMode=3;依赖检查=0; autowireCandidate=true;主=false; factoryBeanName=com.mycompany.springboot.starter.config.ErrorsConfig; factoryMEODName=errorAtinites; initMEODName=null; DestyMEODName=(推断);在类路径资源[com/mycompany/springboo/starter/config/ErrorsConfig.class]]中定义的bean'errorAtinites':已经有[Root bean: class[null];范围=;抽象=false; lazyInit=false; autowireMode=3;依赖项检查=0; autowireCandidate=true;主=false; factoryBeanName=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; factoryMEODName=errrAtinites; initMEODName=null;销毁方法名称=(推断);定义在类路径资源[org/spring框架/引导/自动配置/web/servlet/错误/ErrorMvcAutoConfiguration.class]]绑定

如文档中所述,设置Spring。主要的允许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.properties包含

spring.main.allow-bean-定义-重写=true

共有2个答案

卫宏硕
2023-03-14

更简单的解决方案是添加这个属性spring。主要的在应用程序中允许bean定义覆盖=true。属性

参考

阳凌
2023-03-14

Spring Boot的ErrorAtinitesbean由ErrorMvcAutoConfiguration定义。它被注释为@条件属性OnMisSingBean,所以如果已经定义了ErrorAtinitesbean,它将退避。由于由您的ErrorsConfig类定义的bean试图重写Boot的ErrorAtinitesbean,而不是使其退避,您的ErrorsConfig类必须在Boot的ErrorMvcAutoConfiguration类之后进行处理。这意味着您的启动器有一个订购问题。

处理自动配置类的顺序可以使用@AutoConfigre前@AutoConfigre后来控制。假设ErrorsConfig本身是一个在spring.factories中注册的自动配置类,您可以通过用@AutoConfire之前(ErrorMvcAutoConfiguration.class)注释来解决问题。有了这个变化错误配置将定义它的错误属性bean之前错误MvcAutoConfiguration尝试这样做,这将导致启动的错误属性bean的自动配置后退。

 类似资料:
  • 我正在开发示例。在本例中,我正在为开发代码,并在这里定义相应的bean。 现在,当我运行应用程序时,我得到以下错误。有人能告诉我是什么问题吗? RedisApplication.java

  • 我一直在学习Spring Boot的JavaBrains教程。 我的项目结构如下: courseapiapp.java: topic.java: topicrepository.java: pom.xml: 编辑:我读了这篇文章,解释了即使没有实际实现@Autowired接口是如何工作的。我明白解决办法,但我不明白如何解决我的问题。显然,Spring数据的设置和配置方式存在一些问题(如答案中所述)

  • 我正在学习Spring Boot的JavaBrains教程。 我的项目结构如下: courseapiapp.java: topicService.java: topic.java: topicRepository.java: 编辑:我读到的这篇文章解释了@AutoWired在没有实际实现接口的情况下是如何工作的。我明白解决办法,但我不明白如何解决我的问题。显然,设置和配置Spring数据的方式存在

  • 我正在工作的一个项目在我的业余时间,在这个项目我已被要求与Spring靴工作。我以前对Spring Boot并不熟悉,我试着在stackoverflow和Google上搜索这里,但我似乎无法理解针对我的问题的不同解决方案是如何工作的。 首先,这是我的错误信息: com.project.example.controller.VerverController中的构造函数参数0需要类型为“com.pro

  • 我试图通过定义从WebSecurityConfigureAdapter扩展而来的配置类,为我的自定义安全配置(LDAP JWT)创建自己的spring启动程序。但是,当我使用此初学者启动应用程序时,我会得到: 我发现由于Spring Security性的这个问题,不再可能这样做了。Spring的WebSecurityConfiguration中有一个断言: 我解决了这个问题,在启动器中添加了以下内