J'essaie d'installer DynamoDB localement avec Spring Boot. Au départ, la configuration fonctionnait bien et je pouvais écrire/enregistrer dans DynamoDB via un référentiel. À partir de ce moment, j'ai ajouté plus de classes pour construire mon application. Maintenant, lorsque j'essaie de démarrer mon application, j'obtiens l'exception suivante:
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.
J'ai longuement cherché SO et Internet, mais il n'y avait pas de solution utile à cela. Le message d'erreur est également trompeur.
Mon projet est de la hiérarchie suivante
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 (où AgentRepository est utilisé)
@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 suggère ce qui suit: > 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
.
Que signifie null
ici? Est-ce parce que quelque chose ne va pas dans ma configuration d'application? Aussi, comment est-il possible qu'il soit déjà enregistré?
S'il vous plaît donnez-moi des indications, car je suis tellement confus quant à mes prochaines étapes.
Le remplacement de bean doit être activé à partir de Spring Boot 2.1,
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes
Bean Overriding
La substitution de bean a été désactivée par défaut pour empêcher la substitution accidentelle d'un bean. Si vous comptez sur le remplacement, vous devez définir spring.main.allow-bean-definition-override sur true.
Ensemble
spring.main.allow-bean-definition-overriding=true
ou yml,
spring:
main:
allow-bean-definition-overriding: true
pour activer à nouveau la neutralisation.
Modifier,
La substitution de haricot est basée sur le nom du haricot et non sur son type. par exemple.
@Bean
public ClassA class(){
return new ClassA();
}
@Bean
public ClassB class(){
return new ClassB();
}
Cela provoquera cette erreur dans> 2.1. Par défaut, les noms de beans sont extraits du nom de la méthode. Renommer la méthode ou ajouter l'attribut name
à l'annotation Bean
constituera un correctif valide.