복붙노트

[SPRING] 봄 부팅 - BeanDefinitionOverrideException : 잘못된 Bean 정의

SPRING

봄 부팅 - BeanDefinitionOverrideException : 잘못된 Bean 정의

스프링 부트로 DynamoDB를 로컬로 설치하려고합니다. 처음에는 설치가 작동하고 저장소를 통해 DynamoDB에 쓰고 저장할 수있었습니다. 그 시점에서 필자는 더 많은 클래스를 추가하여 응용 프로그램을 빌드했습니다. 이제 응용 프로그램을 시작하려고하면 다음과 같은 예외가 발생합니다.

저는 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로 정의 된 'agentRepository'bean을 등록 할 수 없습니다. 그 이름을 가진 bean은 이미 널 (null)로 정의되었고 재 지정은 사용 불가능합니다.

여기서 Null은 무엇을 의미합니까? 내 응용 프로그램 구성이 잘못 되었기 때문입니까? 또한 이미 등록되어있을 가능성이 있습니까?

제가 다음 단계에 대해 혼란 스럽기 때문에 저에게 조언을 해주시기 바랍니다.

해결법

  1. ==============================

    1.Bean 재 지정은 스프링 부트 2.1부터 활성화되어야하며,

    Bean 재 지정은 스프링 부트 2.1부터 활성화되어야하며,

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

    세트

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

    과거의

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

    다시 무시할 수 있습니다.

    편집하다,

    Bean Overriding은 Bean 타입이 아닌 Bean의 이름을 기반으로합니다. 예 :

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

    > 2.1에서이 오류가 발생합니다. 기본적으로 bean 이름은 메소드 이름에서 가져옵니다. Bean 어노테이션에 메소드의 이름을 변경하거나 name 속성을 추가하는 것은 유효한 수정 사항입니다.

  2. from https://stackoverflow.com/questions/53723303/springboot-beandefinitionoverrideexception-invalid-bean-definition by cc-by-sa and MIT license