프로젝트를 진행하다 아래와 같은 에러메시지를 만나, 어떻게 해결하는지 정리하고자 합니다.
Implicit super constructor Cat() is undefined. Must explicitly invoke another constructor
원인
이 문제가 발생한 이유는 자식 클래스와 부모 클래스가 있을 때, lombok의 어노테이션으로는 super를 호출 할 수 없기 때문입니다.
무슨 말인지 아래 코드를 통해 살펴 보겠습니다.
//lombok + 생성자 DI 방식
@Component
@RequiredArgsConstructor
public class Animal{
public String state;
private final TestService service;
}
//lombok에서 제공하는 생성자 데코레이터로는 super가 호출이 되지 않음
//AllArgsConstructor도 포함
@Component
@RequiredArgsConstructor
public class Cat extends Animal{
public Long legs;
}
즉, 우리는 별도로 super() 호출을 해 줄 필요가 있는 것 입니다.
해결책
해결하는 방법은 간단합니다.
아래코드 처럼 자식 클래스에서 생성자를 직접 생성하고 그 안에서 suepr를 호출 해주면 됩니다.
@Component
public class Cat extends Animal{
public Long legs;
public Cat(String state, Long legs){
super(state);
this.legs = legs;
}
}
근데 만약 난 생성자를 따로 만드는게 너무 싫고, 꼭 데코레이터를 사용하고 싶다면???
//필드 DI 방식
@Component
public class Animal{
public String state;
@Autowired
private final TestService service;
}
@Component
@RequiredArgsConstructor
public class Cat extends Animal{
public Long legs;
}
위 코드 처럼, 부모 클래스에서 생성자를 빼고, 필드 인젝션 방식으로 DI를 진행해주고,
자식 클래스에서 lombok에서 제공하는 Annotation을 사용해도 됩니다.
하지만, 필드 인젝션보다 생성자 인젝션이 훨씬 권장되는 방식이고, 우월한 방법이기에 첫 번째 방법을 사용하시길 권장 해드립니다.
(생성자 인젝션이 선호되는 이유에 대해서는 링크를 참조해주시길 바랍니다.)
'java,springboot' 카테고리의 다른 글
mariaDB(mysql) Java(R2dbc) 타입 매핑 (TinyInt(1) -> Boolean) (1) | 2023.04.20 |
---|---|
Spring - DI 세가지 방법 (생성자 방식이 좋은 이유 with code) (0) | 2023.04.19 |
Spring - Bean으로 등록하는 2가지 방법(컴포넌트 스캔, 자바 코드) (0) | 2023.04.07 |
vscode에서 gradle로 springboot 개발환경 설정 (0) | 2023.03.01 |
parameter 1 of constructor in required a bean of type that could not be found (0) | 2023.02.27 |