티스토리 뷰
Controller [com.sample.controller.SomeController]
Method [public com.sample.SomeObject com.sample.controller.SomeController.page(public com.sample.SomeObject)] with argument values:
[0] [type=org.springframework.validation.support.BindingAwareModelMap] [value={}] ] with root cause
java.lang.IllegalArgumentException: argument type mismatch
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
대략 위와 같은 오류가 나는 상황이 있다.
오류의 내용은 호출한 Controller의 Method가 실행되기 전 parameter로 전달받은 SomeObject가 argument type mismatch라는 것이다. Controller에서는 사용할 수 있는 Method Parameter가 정해져 있는데 이 정해진 것 외에 내가 추가로 만들수도 있다. 하지만 이렇게 추가로 만들어서 Method Parameter로 받으려고 했는데 실패를 했을때 위와 같은 오류가 발생을 한다. 참고로 Spring에서 기본적으로 사용할 수 있는 Method Parameter는 다음과 같다. .
Parameter type | 설명 |
HttpServletRequest HttpSerlvetResponse HttpSession |
Servlet API |
java.util.locale | 현재 요청에 대한 Locale |
InputStream, Reader | 요청 컨텐츠에 직접 접근할 때 사용 |
OutputStream, Writer | 응답 컨텐츠를 생성할 때 사용 |
@PathVariable | URI 템플릿 변수에 접근할 때 사용 |
@RequestParam | HTTP 요청 파라미터를 매핑 |
@RequestHeader | HTTP 요청 헤더를 매핑 |
@CookieValue | HTTP 쿠키 매핑 |
@RequestBody | HTTP 요청의 몸체 내용에 접근할 때 사용 |
Map, Model, ModelMap | 뷰에 전달할 모델 데이터를 설정할 때 사용 |
Error, BindingResult | HTTP 요청 파라미터를 커맨드 객체에 저장한 결과. 커맨드 객체 파라미터 바로 뒤에 위치해야 함. |
SessionStatus | 세션을 파기해야 하는 경우에 사용 |
해결방법으로는 내가 만든 ArgumentResolver가 정상적으로 동작하고 있는지 확인을 해봐야 한다.
첫번째로는 WebConfig.java 설정이 제대로 되었는지 확인을 해보자. WebConfig는 일반적으로 springboot 환경에서 Spring의 web단 설정을 하는 Config 파일이라고 보면 된다 (구 dispatcher-context.xml 와 비슷한 이름의 설정파일)
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
이런식으로 ArgumentResolver를 잘 동작시킬 수 있도록 WebMvcConfigurationSupport를 extends 했는지 살펴보자. (@EnableWebMvc를 사용하는 경우는 다른 방법으로 해야 함)
또한 위처럼 잘 클래스부를 선언 했다 하더라도 ArgumentResolver 등록하는 부분에서 실수가 있을수도 있다.
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new SomeArgumentResolver());
}
이런 식으로 잘 등록을 했는지 확인을 하고 디버깅 모드로 내가 만든 ArgumentResolver로 잘 들어가는지 확인을 해본다.
이렇게 했는데도 안된다면 제대로 Method Parameter로 받을 객체를 잘 생성했는지 다음 글을 보며 다시 해보자.
끝!
'Framework > Spring' 카테고리의 다른 글
Springboot @ConfigurationProperties warning 조치 (0) | 2021.08.04 |
---|---|
Springboot application.yml (application.properties) 파일 분리방법 (0) | 2021.08.02 |
Spring Controller에서 외부 URL 호출하기 (0) | 2021.07.15 |
Spring Locale처리 - CookieLocaleResolver 사용법 (0) | 2021.07.13 |
Springboot 에서 Servlet 설정하기 (0) | 2021.07.02 |