首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringBoot - BeanDefinitionOverrideException:无效bean定义

SpringBoot - BeanDefinitionOverrideException:无效bean定义
EN

Stack Overflow用户
提问于 2018-12-11 11:33:43
回答 7查看 120.6K关注 0票数 91

我正在尝试用Spring在本地安装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.

我已经搜索了如此广泛的互联网,但没有任何有用的解决方案。错误信息也具有误导性。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 )

代码语言:javascript
复制
@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在这里是什么意思?是因为我的应用程序配置有问题吗?还有,它怎么可能已经注册了?

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-12-11 11:58:08

必须启用Bean重写,从SpringBoot2.1开始,

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

Bean覆盖 默认情况下已禁用Bean覆盖,以防止bean意外被重写。如果您依赖于重写,则需要将Spring.main.low-bean定义-重写为true。

设置

代码语言:javascript
复制
spring.main.allow-bean-definition-overriding=true

或者yml,

代码语言:javascript
复制
spring:
   main:
     allow-bean-definition-overriding: true

再次启用覆盖。

编辑,

Bean重写是基于bean的名称,而不是它的类型。例如:

代码语言:javascript
复制
@Bean
public ClassA class(){
   return new ClassA();
}

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

将在> 2.1中导致此错误,默认情况下,bean名称将从方法名称中提取。将方法重命名或将name属性添加到Bean注释将是一个有效的修正。

票数 154
EN

Stack Overflow用户

发布于 2020-02-06 14:29:27

使用这种方法启用bean覆盖,例如

代码语言:javascript
复制
@SpringBootTest(properties = "spring.main.allow-bean-definition-overriding=true")

代码语言:javascript
复制
@SpringBootApplication (properties = "spring.main.allow-bean-definition-overriding=true")
票数 20
EN

Stack Overflow用户

发布于 2020-05-19 19:01:10

我想我对MongoDB也有同样的问题。至少错误消息看起来完全相同,而且我也只有一个MongoDB存储库,如下所示:

代码语言:javascript
复制
public interface MyClassMongoRepository extends MongoRepository<MyClass, Long> {
}

这个问题是由以前在另一个数据库中使用的MyClass类引起的。Spring在创建JpaRepository之前默默地创建了一些MongoRepository。这两个存储库的名称都是相同的,这导致了冲突。

解决方案是复制MyClass,将其移动到MongoRepository的包中,并删除任何特定于JPA的注释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53723303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档