我正在尝试使用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。
> 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 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.
Set
spring.main.allow-bean-definition-overriding=true
or 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注释将是有效的解决方案。