当前位置: 首页 > 面试题库 >

SpringBoot-BeanDefinitionOverrideException:无效的Bean定义

汪坚
2023-03-14
问题内容

我正在尝试使用Spring
Boot在本地设置DynamoDB。最初,我开始进行设置,并能够通过存储库将其写入/保存到DynamoDB。从那时起,我添加了更多类来构建我的应用程序。现在,当我尝试启动应用程序时,出现以下异常:

org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'agentRepository' defined in null: Cannot register bean definition [Root bean: class [org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'agentRepository': There is already [Root bean: class [org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.

我已经广泛搜索了SO和Internet,但是对此没有任何有用的解决方案。该错误消息也具有误导性。

我的项目属于以下层次结构

ai.test.as
  - as
      - agent
          - business
          - intent
          - exception
          - Agent.java
          - AgentDTO.java
          - AgentRespository.java
          - AgentController.java
          - AgentService.java
          - AgentServiceImpl.java
  - config
     - DynamoDBConfig.java

DynamoDBConfig.java

package ai.test.as.config;

import ai.test.as.agent.AgentRepository;
import ai.test.as.agent.intent.template.TemplateRepository;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableDynamoDBRepositories(basePackageClasses = {AgentRepository.class})
public class DynamoDBConfig
{
    @Value("${aws.dynamodb.endpoint}")
    private String dynamoDBEndpoint;

    @Value("${aws.auth.accesskey}")
    private String awsAccessKey;

    @Value("${aws.auth.secretkey}")
    private String awsSecretKey;

    @Bean
    public AmazonDynamoDB amazonDynamoDB()
    {
        AmazonDynamoDB dynamoDB = new AmazonDynamoDBClient(getAwsCredentials());
        dynamoDB.setEndpoint(dynamoDBEndpoint);

        return dynamoDB;
    }

    @Bean
    public AWSCredentials getAwsCredentials()
    {
        return new BasicAWSCredentials(awsAccessKey, awsSecretKey);
    }
}

AgentRepository.java

package ai.test.as.agent;

import ai.test.as.agent.Agent;
import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
import org.springframework.data.repository.CrudRepository;

@EnableScan
public interface AgentRepository extends CrudRepository<Agent, String>
{
}

AgentController.java(使用AgentRepository的位置)

@RestController
@RequestMapping(value = "/v1/agents")
public class AgentController
{
    @Autowired
    private AgentRepository agentRepository;

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public void test()
    {
        Agent agent = new Agent();
        agent.setAgentNumber("123456");
        agent.setId(1);

        agentRepository.save(agent);
    }
}

Spring建议以下内容: > The bean 'agentRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled

null是什么意思?是因为我的应用程序配置有问题吗?还有怎么可能已经注册?

请给我一些指示,因为我对下一步工作感到很困惑。


问题答案:

从Spring Boot 2.1开始必须启用Bean覆盖,

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-
Notes

Bean覆写

默认情况下禁用Bean覆盖,以防止意外覆盖Bean。如果您依赖覆盖,则需要将spring.main.allow-bean-definition-
overriding设置为true。

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

或yml,

spring:
   main:
     allow-bean-definition-overriding: true

再次启用覆盖。

编辑,

Bean覆盖基于Bean的名称而不是其类型。例如

@Bean
public ClassA class(){
   return new ClassA();
}

@Bean
public ClassB class(){
   return new ClassB();
}

在> 2.1中将导致此错误,默认情况下,bean名称取自方法名称。重命名方法或将name属性添加到Bean注释将是有效的解决方案



 类似资料:
  • 为每个存储库/实体选择JPA/JDBC的最佳实践是什么? PS:发现,带有basePackages属性,但我不确定这是否是个好主意

  • 我使用SpringBoot start构建了一个用于学习的项目 但是当我添加由mybatis生成器生成的orm文件时,它启动失败。 例如: 我已经配置了mybatis locationmapper属性和sqlSessionFactoryBean 这是我的application.properties文件:

  • 我在和spring合作,我的实体是 myEntity.java 我试图改变像这样的字段的属性 myPage.html 但它显示了这个错误 2018-08-20 09:09:36.000错误13144--[nio-8092-exec-1]O.A.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的servlet

  • 我是Spring的新手,我有个例外。 我有一个jsp,有很多选择。它们都工作正常,但有一个显示了这个例外: 我正在以与其他工作正常的人相同的方式实施selct。下面是jsp代码: 这里是控制器: 这里,实体Expediente: 最后是TipoExpedinte实体 我认为这可能发生,因为PharmantePadre属性是同一实体Pharmante的外键,但我不知道如何解决它。。。 要帮忙吗?谢谢

  • 我正在尝试使用Open Jdk 15、Springboot 2.6.0和Springfox 3启动一个Springboot项目。我们正在开发一个项目,该项目将Netty替换为Web服务器,并使用Jetty,因为我们不需要非阻塞环境。 在代码中,我们主要依赖于Reactor API(Flux,Mono),因此我们不能删除org.springframework。启动:spring boot start

  • 主存储库文件 ==================================自定义存储库 ============================================ 定制回购方法的实现 ===================================================== 服务等级 在myRepository上遇到异常请考虑定义一个myRepository类