• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JPA 사용시 Invalid bean definition 에러 질문입니다.

21.12.02 21:29 작성 조회수 4.07k

0

안녕하세요

스프링DB접근기술 - JPA 강의 부분에서

스프링부트 JPA 연동해서 실행하는데 아래와 같은 에러가 나서 질문드립니다.

Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memberService' defined in class path resource [com/example/hellospring/SpringConfig.class]: Cannot register bean definition [Root bean: class [null];

 

제가 이해한 바로는

memberService에서 bean이 잘못 정의 되어 있고,

SpringConfig 클래스에서 bean을 등록할수 없다고하는데

루트 bean 클래스가 null 이라는데 (이건 어디가 루트고 어디가 null 인지 잘 모르겠습니다.)

아래 코드들로 확인할 수 있는 방법이 있을까요?

대체 어디가 bean이 잘못 정의 되어 있고 null 인지를 모르겠네요.. 

 

아래는 memberService 코드입니다. import문은 전부 제거했습니다.

package com.example.hellospring.service;

@Transactional
@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    /**
     * 회원가입
     */
    public Long join(Member member){
        validateDuplicateMember(member); // 중복회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

 

다음은 SpringConfig.java 코드입니다. 역시나 import문은 제거했습니다.

package com.example.hellospring;

@Configuration
public class SpringConfig {

    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em) {
        this.em = em;
    }

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
        return new JpaMemberRepository(em);
    }
}

 

참고로 회원가입에서 Run으로 실행하기 전까지는 db도 잘 연결되고 아주 잘 따라하고 있었습니다

감사합니다

답변 3

·

답변을 작성해보세요.

0

OMG님의 프로필

OMG

2021.12.04

인텔리제이 콘솔 한글 깨짐은 아래 링크 참고부탁드립니다.

 https://www.inflearn.com/questions/328304

0

OMG님의 프로필

OMG

2021.12.02

안녕하세요. 리자몽님, 공식 서포터즈 OMG입니다.

 

 

지금 보시면 Service클래스의 빈 등록을 @Service를 선언하여 1번, Config 파일에서 @Bean으로 수동 등록하여 총 2번의 빈 등록(중복)이 발생하고 있습니다.

 

 

@Service 를 지워주세요




감사합니다.

리자몽님의 프로필

리자몽

질문자

2021.12.02

답변 감사합니다 그런데 새로운 오류가 발생합니다

'JpaProperties'에 바인딩을 할 수 없다고 뜨네요

제 application.properties 설정이 잘못됐나요?

참고로 제 application.properties 는 아래와 같습니다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true #jpa가 날리는 sql을 볼 수 있음
spring.jpa.hibernate.ddl-auto=none

 

에러 메시지는 아래와 같습니다.(한글깨짐은 검색한 모든 방법을 동원해도 바뀌지 않아서 양해 부탁드립니다..)

Caused by: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'spring.jpa-org.springframework.boot.autoconfigure.orm.jpa.JpaProperties': Could not bind properties to 'JpaProperties' : prefix=spring.jpa, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.jpa.show-sql' to boolean

Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [boolean] for value 'true    #jpa가 ë‚ ë¦¬ëŠ” sql을 ë³¼ 수 있음'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [true    #jpa가 ë‚ ë¦¬ëŠ” sql을 ë³¼ 수 있음]

Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [true    #jpa가 ë‚ ë¦¬ëŠ” sql을 ë³¼ 수 있음]

Caused by: java.lang.IllegalArgumentException: Invalid boolean value [true    #jpa가 ë‚ ë¦¬ëŠ” sql을 ë³¼ 수 있음]

혹시모르니 build.gradle도 같이 올립니다.

plugins {
id 'org.springframework.boot' version '2.4.12'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
useJUnitPlatform()
}

안녕하세요. 

spring.jpa.show-sql 뒷부분에 있는 #jpa가 날리는 sql을 볼 수 있음 <- 여기를 모두 제거해주세요.

properties 파일은 주석을 이렇게 중간에 넣을 수 없습니다.

0

리자몽님의 프로필

리자몽

질문자

2021.12.02

작성자 답변입니다.

SpringConfig.java 에서

아래와 같이 PersistenceContext 어노테이션을 달았는데 동일한 에러가 발생하네요..

참고로 public SpringConfig 생성자에 @PersistenceContext  달면 생성자에는 달 수 없다는 표시가 뜨네요

@PersistenceContext
private EntityManager em;

//@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}