Spring Boot - Bean Definition Override예외:잘못된 콩 정의
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
Dynamo DBConfig.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);
}
}
봄은 다음을 제안합니다.> 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 Overriding을 활성화해야 합니다.
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes
Bean Overriding(빈 오버라이드)
빈 오버라이드는 디폴트로 디세블로 되어 있기 때문에 실수로 오버라이드가 되는 것을 방지합니다.덮어쓰기를 사용하는 경우 spring.main.allowbean-definition-overriding을 true로 설정해야 합니다.
세트
spring.main.allow-bean-definition-overriding=true
또는 yml,
spring:
main:
allow-bean-definition-overriding: true
덮어쓰기를 다시 활성화합니다.
편집,
Bean Overriding은 콩의 종류가 아닌 이름을 기반으로 합니다.
@Bean
public ClassA class(){
return new ClassA();
}
@Bean
public ClassB class(){
return new ClassB();
}
이 에러는 > 2.1에서 발생합니다.디폴트로는 bean 이름은 메서드 이름에서 가져옵니다.메서드 이름 변경 또는 추가name
의 탓으로 돌리다Bean
주석이 유효한 수정이 됩니다.
예를 들어, 이러한 접근법으로 bean override를 사용하도록 설정합니다.
@SpringBootTest(properties = "spring.main.allow-bean-definition-overriding=true")
또는
@SpringBootApplication (properties = "spring.main.allow-bean-definition-overriding=true")
MongoDB도 같은 문제가 있었던 것 같아요.적어도 오류 메시지는 똑같아 보였고 MongoDB용 저장소도 하나밖에 없었습니다. 다음과 같습니다.
public interface MyClassMongoRepository extends MongoRepository<MyClass, Long> {
}
이 문제는 이전에 다른 데이터베이스에서 사용되었던 MyClass 클래스로 인해 발생하였습니다.Spring은 Mongo Repository를 만들기 전에 Jpa Repository를 사일런트하게 만들었습니다.두 리포지토리의 이름이 동일하여 충돌이 발생했습니다.
해결책은 MyClass 복사본을 만들어 MongoRepository 패키지로 이동하고 JPA 고유의 주석을 삭제하는 것이었습니다.
Postgre를 추가하려고 하다가 우연히 같은 문제를 발견했습니다.spring-data-jdbc 경유로 기존 프로젝트에 대한 SQL 데이터베이스가 이미 MongoDB를 사용하고 있었습니다.
MongoDB와 Postgre의 저장소가 문제였던 것 같습니다.SQL은 두 모듈(spring-mongo 및 spring-jdbc)에 의해 스캔되었습니다.둘 다 콩을 만들고 충돌하려고 합니다.
내 경우 MongoDB 저장소와 Postgre는SQL 리포지토리가 동일한 패키지에 있습니다.
받아들여진 답변으로 문제가 해결되었습니다.그러나, 다음의 스타트 업 로그로부터 힌트를 얻었습니다.
Finished Spring Data repository scanning in 319ms. Found 4 repository interfaces
Finished Spring Data repository scanning in 319ms. Found 5 repository interfaces
Postgre 저장소가 하나밖에 없는데 이상해요.SQL 및 MongoDB의 경우 4.
나는 우체통을 옮겼다.SQL 저장소를 MongoDB 저장소와 다른 패키지로 만들고 Postgre의 기본 패키지를 구성했습니다.SQL 저장소를 새 패키지로 이동합니다.내 경우:
@EnableJdbcRepositories(basePackageClasses = MyOnlyPostgreSQLRepository.class) // TODO: Use the real package or a dedicated base class
이것으로 문제가 해결되었습니다(빈 오버라이딩으로 설정된 자산은 없습니다).스타트업 로그에도 현재 올바른 저장소 수(1과 4)가 표시됩니다.
같은 문제를 발견했는데, 문제는 여러 저장소 팩토리가 모든 저장소 인터페이스를 등록하려고 한다는 것이었습니다. 경우는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.JpaRepositoryFactoryBean
&DynamoDBRepositoryFactoryBean
다른 답변에서 언급했듯이, 다음과 같이 로그에서 확인할 수 있습니다.
[INFO] Bootstrapping Spring Data DynamoDB repositories in DEFAULT mode.
[INFO] Finished Spring Data repository scanning in 64ms. Found 2 DynamoDB repository interfaces.
[INFO] Bootstrapping Spring Data JPA repositories in DEFAULT mode.
솔루션은 다음과 같습니다.
- 호환성 매트릭스를 확인하여 spring-data-dynamodb/spring-boot/spring-data 호환 버전을 사용하고 있는지 확인합니다.
- 각 리포지토리는 한 번만 생성해야 합니다.내 경우엔, 내가 더해야 했어
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
Configuration은 버전에 따라 다를 수 있으며 응용 프로그램에 있는 리포지토리 수에 따라 달라집니다.Multi-Repository-Configuration에 대해 읽어보시면 도움이 될 수 있습니다.
나의 경우, 2개의 maven depensity가 같은 Bean으로 정의되어 있었다.가 이걸 할 때 발견했어요.mvn dependency:tree
제 모든 프로젝트에 대해서요.
application.properties 파일에서 spring.main.allow-bean-definition-distining=true를 사용할 수 있습니다.
또는
@SpringBootApplication 사용(속성 = "spring.main.allowbean-definition-definition-disciding=true")
언급URL : https://stackoverflow.com/questions/53723303/springboot-beandefinitionoverrideexception-invalid-bean-definition
'programing' 카테고리의 다른 글
부호화되지 않는 이유단일 따옴표/부호를 인코딩하는 URIC 컴포넌트 (0) | 2023.03.31 |
---|---|
React의 useState 훅을 사용할 때 nullable 상태를 입력하는 올바른 방법 (0) | 2023.03.31 |
jQuery Ajax 호출 및 HTML.위조 방지토큰() (0) | 2023.03.31 |
Python Flask, TypeError: 'dict' 개체를 호출할 수 없습니다. (0) | 2023.03.31 |
Woocommerce 업데이트 카트 버튼 작업 후 실행 중인 후크 (0) | 2023.03.26 |