빈 RequestParam 값이 defaultValue를 사용하도록 할 수 있습니까?


120

다음과 유사한 요청 매핑이있는 경우 :

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

그런 다음이 요청을 다음과 같이 호출합니다.

http://example.com/test?i=

오류 메시지가 나타납니다.

'java.lang.String'유형의 값을 'int'유형으로 변환하지 못했습니다. 중첩 된 예외 : java.lang.NumberFormatException : 입력 문자열 : "" '

자바 스크립트 클라이언트가 빈 매개 변수를 보내지 못하도록하거나 문자열 값을 받아들이고 비어 있지 않은 경우에만 구문 분석하여이 문제를 해결할 수 있습니다.

업데이트 : 이후 버전의 봄은 이제 원래 원하는 동작을 구현합니다.

나는 방금 봄 4.3.5에서 이것을 테스트했으며 이제 동작이 실제로는를 올리지 않고 null 값을 기본값으로 바꾸는 것을 발견했습니다 NumberFormatException. 내 원래 매핑이 이제 제대로 작동합니다.

이 동작이 변경된 봄 버전을 잘 모르겠습니다.


확실히 매개 변수는 해당 예외를 발생시키는 Integer 유형입니까?
laher

3
스프링 전문가는 아니지만 설정하지 않으면 기본값이 사용됩니까? 즉, 요청이 example.com/test 일 경우 ? example.com/test?i= 를 사용하면 i가 존재하고 ""로 설정되므로 기본값이 사용되지 않습니다
user902383

감사합니다 amir75, 실수로 제공된 String유형. user902383, 맞습니다. 정수 값의 경우 null / 빈 값이 대신 defaultValue를 사용하는 것을 선호합니다.
브렛 라이언

답변:


175

@RequestParam 유형을 Integer로 변경하고 필요하지 않게 만들 수 있습니다. 이렇게하면 요청이 성공할 수 있지만 그러면 null이됩니다. 컨트롤러 메서드에서 명시 적으로 기본값으로 설정할 수 있습니다.

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

위의 예에서 defaultValue를 제거했지만, 전혀 설정되지 않은 요청을 수신 할 것으로 예상되는 경우 포함 할 수 있습니다.

http://example.com/test

6
이것에 대한 업데이트, 최신 버전의 스프링은 실제로 더 이상 null 검사가 필요하지 않습니다. 빈 값이 기본값이 사용되도록하는 스프링에 원하는 동작이 포함 되었기 때문입니다.
Brett Ryan

3
구식 답변, 최고의 솔루션은 @AppLend
Jose Pose S

101

기본값을 설정하여 기본 유형을 유지할 수 있습니다. 귀하의 경우에는 "required = false" 속성 만 추가하면 됩니다.

@RequestParam(value = "i", required = false, defaultValue = "10") int i

추신 : Spring 문서의이 페이지는 유용 할 수 있습니다 : Annotation Type RequestParam


1
감사합니다. 제목에있는 내 질문의 요점을 놓쳤습니다. 빈 매개 변수를 제공 할 수있는 기능을 요청했으며 비어 /test?i=있기 때문에 i기본값이 있습니다.
Brett Ryan

5
어쨌든, 때 defaultValue, 제공된 required == false암시
티무르 Milovanov에게

4
매개 변수가 제공되었지만 비어있는 경우 defaultValue적용되지 않습니다.
브렛 라이언

12

int 대신 일반 클래스 Integer를 사용하여 RequestParam을 설정할 수 있습니다. 그러면 문제가 해결됩니다.

   @RequestParam(value= "i", defaultValue = "20") Integer i

1

다음과 같이 할 수도 있습니다.

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i

3
defaultValue가있는 경우이를 선택 사항으로 만들 필요가 없습니다.
Kevin M

1

이것은 2013 년에 버그로 간주되었습니다 : https://jira.spring.io/browse/SPR-10180

버전 3.2.2로 수정되었습니다. 그 이후에는 어떤 버전에서도 문제가 발생하지 않아야하며 코드는 정상적으로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.