querydsl로 개발을 하다가 no constructor found for class Exception이 떴다.
보통 no constructor found for class Exception이 뜨는 경우는 Projections.constructor()를 사용하여 해당하는 객체의 생성자에 바로 초기화를 해주는 경우 자주 발생한다.
하지만 나의 경우에는 @QueryProjection을 사용하여 QDto의 객체에 넘겨주는 방식을 사용하고 있어서 파라미터 순서가 맞지 않거나 파라미터 갯수가 맞지 않으면 compiler단에서 바로 에러가 난다.
query projection에 사용 된 inner class......
public class OuterClass{
pulic class InnerClass{
private String innerId;
private String innerName;
private Integer innerOption1;
private Double innerOption2;
@QueryProjection
public InnerClass(String innerId, String innerName) {
this.innerId = innerId;
this.innerName = innerName;
}
}
}
이리저리 머리를 굴려가며 한참을 헤맨결과 inner class에 static이 빠져있다.
원인을 알았으니 상세하게 이유를 찾아보자......
@QueryProjection 어노테이션은 Querydsl의 생성자 주입 기능을 활용하기 위해 사용된다. 이 어노테이션은 Querydsl이 자동으로 생성한 생성자를 호출하여 쿼리 결과를 해당 클래스에 매핑해 준다.
그러나 static이 아닌 inner class의 경우에는 기본 생성자가 자동으로 생성되지 않는다. 따라서 @QueryProjection을 사용하기 위해서는 inner class에 기본 생성자를 명시적으로 추가해야 한다.
public class OuterClass{
pulic static class InnerClass{
private String innerId;
private String innerName;
private Integer innerOption1;
private Double innerOption2;
@QueryProjection
public InnerClass(String innerId, String innerName) {
this.innerId = innerId;
this.innerName = innerName;
}
}
}