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

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

@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. 내 원래 매핑이 이제 제대로 작동합니다.

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



답변

@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


답변

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

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

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


답변

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

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


답변

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

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


답변

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

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


답변