문제
java.lang.IllegalStateException: Cannot resolve parameter names for constructor cat.community.NyangMunity.board.request.BoardListRequest(java.lang.Integer,java.lang.Integer)
최근에 개인 프로젝트를 리팩토링 하는 과정에서 발생한 문제이다.
발생하게 된 계기는 자바 버전(15
→ 17
)과 스프링 부트 버전(2.5.9
→ 3.2.0
)을 업그레이드 하면서 발생하게 되었다.
기존 코드는 아래와 같았고, 정상적으로 작동하던 코드에서 에러가 발생했다.
@Getter @Setter @Builder
public class BoardListRequest {
private static final Integer MAX_SIZE = 100;
@Builder.Default
private Integer page = 1;
@Builder.Default
private Integer size = 10;
public long getOffset() {
return (long) (max(1, page) - 1) * min(MAX_SIZE, size);
}
}
에러 내용은 생성자의 매개변수 이름을 해석할 수가 없다는 뜻이였고, 이것저것 많이 시도해보다가 버전 업그레이드로 인한 이슈임을 알게 되었다.
원인
Spring boot 3.2.0 부터는 Spring Framework 6.1을 사용하게 되었다.
LocalVariableTableParameterNameDiscoverer
를 더 이상 사용하지 않게 되었고 이로 인해 발생할 수 있는 매개 변수 관련 이슈는 -parameter
옵션을 Compile 시에 활성화 시켜야 된다고 한다.
해결 방법
-parameter 옵션 활성화
IntelliJ IDEA
- Build, Execution, Deployment → Compiler → Java Compiler → Additional command line parameters
-parameters
추가- build.gradle에 아래 내용 추가
tasks.withType(JavaCompile) {
options.compilerArgs << "-parameters"
}
Eclipse IDE
- Java → Compiler → Store
- information about method parameters (usable via reflection) [following checkbox]
- Maven은 아래 내용 추가
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
세터 메서드 바인딩 사용
해당 이슈가 아무래도 생성자 바인딩을 통해 발생하는 이슈이기에,@NoArgsConstructor
와 @Setter
를 사용해서 세터 메서드 바인딩을 사용하면 해결할 수 있다.
@NoArgsConstructor
@AllArgsConstructor
@Getter @Setter @Builder
public class BoardListRequest {
private static final Integer MAX_SIZE = 100;
@Builder.Default
private Integer page = 1;
@Builder.Default
private Integer size = 10;
public long getOffset() {
return (long) (max(1, page) - 1) * min(MAX_SIZE, size);
}
}
버전 다운그레이드
버전을 다운 그레이드 하면 정상작동한다.
Spring boot 프로젝트 생성 페이지에서 선택할 수 있는 가장 낮은 버전이기도 하고
3.1.6
으로 다운 그레이드 해서 해결한 사례가 있어 테스트 해보았다.
필자는 Spring boot를 3.1.7
버전으로 다운 그레이드하면 정상 작동했다.
참고
[Spring] @ModelAttribute 사용할 때 주의할 점
@Builder, @All/NoArgsConstructor 제대로 알고 사용하자!
스프링 부트 2에서 스프링 부트 3로 업그레이드 가이드
https://hyeon9mak.github.io/model-attribute-without-setter/
'트러블슈팅' 카테고리의 다른 글
Kakao Login 시 401 Unauthorized (1) | 2024.01.26 |
---|---|
CreatedDate, LastModifiedDate 사용 시 값이 들어가지 않는 이슈 (0) | 2024.01.21 |
[오류를 잡아보자] JSON 직렬화에서의 이슈 해결 (through reference chain) (0) | 2024.01.12 |
WSL 설치 오류 (1) | 2023.12.20 |
[오류를 잡아보자] Spring boot 에서의 경로 지정 (ERR_ABORTED 404 해결) (0) | 2022.03.20 |