java - SpringBoot - BeanDefinitionOverrideExceptio

我正在尝试使用 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 和互联网,但没有任何有用的解决方案。错误消息也具有误导性。

我的项目具有以下层次结构

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 建议如下: > 无法注册在 null 中定义的 bean 'agentRepository'。已在 null 中定义了具有该名称的 bean,并且已禁用覆盖

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

请给我一些指示,因为我对接下来的步骤感到很困惑。

最佳答案

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

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

Bean Overriding

Bean overriding has been disabled by default to prevent a bean being accidentally overridden. If you are relying on overriding, you will need to set spring.main.allow-bean-definition-overriding to true.

设置

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

或yml,

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

再次启用覆盖。

编辑,

Bean Overriding 是基于 bean 的名称而不是它的类型。例如

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

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

在> 2.1中会导致这个错误,默认bean名称取自方法名称。重命名方法或将 name 属性添加到 Bean 注释将是有效的修复方法。

关于java - SpringBoot - BeanDefinitionOverrideException : Invalid bean definition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53723303/

相关文章:

java - 通过 Spring 将字段注入(inject) Hibernate 加载的实体中

java - RestTemplate 不转义 url

performance - ORM 解决方案(JPA;Hibernate)与 JDBC

java - 使用 Spring 将文本文件直接注入(inject) String

mysql - spring jpa application.properties useSSL

spring - 不使用 Maven 下载 Spring Jars

spring - 是否可以在表单 :select/form:option 的 itemLabel 中

java - Spring Redis - 从 application.properties 文件中

spring - Thymeleaf - 使用 PUBLICID "null"请求的不受支持的实体

java - servlet 映射 url 模式上的双通配符 (*) 是什么意思?