Error

[Spring boot - 에러 해결] Bytecode enhancement failed because no public, protected or package private default constructor was found for entity

chea-young

1. 에러 메시지

Bytecode enhancement failed because no public, protected or package private default constructor was found for entity.

 


2. 원인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Entity
@Getter @Setter
public class Writer extends BaseTimeEntity{
    @Id
    @GeneratedValue
    @Column(name = "writer_id")
    private Long id; //  id
 
    private String name; // 작가 이름
 
    @OneToMany(mappedBy = "publisher")
    private List<Book> books = new ArrayList<>();
 
    public Writer (String name) {
        this.name = name;
    }
 
    //==연관관계 메서드==//
    public void setBook(Book book) {
        this.books.add(book);
        book.setWriter(this);
    }
}
 
 

FK로 Book에서 writer가 proxy로 접근 권한이 되는데 private이므로 proxy 객체 생성을 하는 로직에서 오류가 발생한 것이다.

 


3. 해결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Entity
@Getter @Setter
@NoArgsConstructor //추가
public class Writer extends BaseTimeEntity{
    @Id
    @GeneratedValue
    @Column(name = "writer_id")
    private Long id; //  id
 
    private String name; // 작가 이름
 
    @OneToMany(mappedBy = "publisher")
    private List<Book> books = new ArrayList<>();
 
    public Writer (String name) {
        this.name = name;
    }
 
    //==연관관계 메서드==//
    public void setBook(Book book) {
        this.books.add(book);
        book.setWriter(this);
    }
}
 
 

3줄 처럼 추가를 해주면 생성자가 저절로 생성되어 에러를 해결할 수 있다. 

혹시 해당 방법이 안된다면 조회하는 Entity와 통해서 접근되어지는 Entity에 `@NoArgsConstructor(access = AccessLevel.PROTECTED)` 어노테이션을 붙여주면 된다. 


참고 사이트

- https://erjuer.tistory.com/106