티스토리 뷰

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로 받을 객체를 잘 생성했는지 다음 글을 보며 다시 해보자. 

 

Spring Custom ArgumentResolver 만들기 초간단 예제

Spring을 사용하면서 ArgumentResolver라는것을 한번은 들어봤을 것이다. 이것은 Servlet 과 Controller 사이에서 전달되어진 값을 가공하거나 추가할 필요가 있을때 사용한다. AOP와 같이 중복 코드를 제거

oingdaddy.tistory.com

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31