[Spring] org.springframework.validation.BindException 오류

런타임 오류 메시지:


org.springframework.validation.BindException:
org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'search' on field 'id': rejected value []; codes [typeMismatch.command.search,typeMismatch.search,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [command.search,id]; arguments []; default message [search]]; default message [Failed to convert property value of type [java.lang.String] to required type [int] for property 'id'; nested exception is java.lang.NumberFormatException: For input string: ""]

** 원인

jsp model의 객체와 VO의 vairable 간의 매칭하는 과정에서 type이 맞지 않아 발생
null 값을 가진 string 객체를 int 변수로 받을 수 없어 발생하는 typeMismatch 오류

** 해결

VO의 int 변수를 Integer 타입으로 변경
==> Integer 타입은 null 값을 null로 저장하는 로직을 포함하고 있음 (int는 없고)

** 참고

org.springframework.validation.BindException 오류

해당 int값을 Integer 값으로 변환시켜주면 문제가 해결된다.
Integer값이 null일경우 null로 값이 들어가기 때문에 디폴트로 값을 설정해주면 된다.

[Spring 3 – @MVC] @Controller #2 – 파라미터와 리턴 타입의 종류

파라미터의 타입은 URL 의 내용이 적절히 변환될 수 있는 것을 사용해야 한다. int 타입을 썻을 경우에는 반드시 해당 패스 변수 자리에 숫자 값이 들어 있어야 한다. 타입이 일치하지 않는 값이 들어 올 경우 별 다른 예외처리를 해주지 않는 다면 HTTP 400 – Bad Request 응답코드가 전달될 것이다.

@RequestParam, @ModelAttribute 애노테이션을 사용하면 메소드 선언이 길어지고 복잡해 보인다고 이를 무조건 생략하는 건 위험할 수 있다. 그래서 가능한 @ModelAttribute 나 @RequestParam 을 사용하는 것을 권장한다.

단지 요청 파라미터를 메소드 파라미터에서 1:1로 받으면 @RequestParam 이고, 도메인 오브젝트나 DTO 의 프로퍼티에 요청 파라미터를 바인딩해서 한번에 받으면 @ModelAttribute 라고 볼 수 있다. 하나의 오브젝트에 클라이언트의 요청 정보를 담아서 한 번에 전달되는 것이기 때문에 이를 커맨드 패턴에서 말하는 커맨드 오브젝트라고 부르기도 한다.

요청 파라미터가 많은 경우 @RequestParam 으로 모두 1:1로 받으면 코드가 아무래도 지저분 해진다. 대신 모든 요청 파라미터를 바인딩할 프로퍼티들을 가지는 하나의 클래스를 정의해 사용하면 코드는 무척이나 깔끔해 질 것이다.

정리하자면,

  • 1) VO의 숫자형 변수는 Integer, Long, Float 등으로 선언해야 하고
  • 2) Controller에 ‘@ModelAttribute’ 또는 ‘@RequestParam’ 등의 어노테이션으로 연결관계를 명시하는게 좋다
    – 쓸데없는 생략, 오만한 생략은 개발의 생산성만 떨어뜨릴뿐! 습관이 중요하다!!
  • 3) 파라미터의 디폴트 설정은 defaultValue, 생략 여부는 required를 사용한다.
    – 참고1: Is it possible to have empty RequestParam values use the defaultValue?
    – 참고2: Annotation Type RequestParam

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: