Có thể có các giá trị RequestParam trống sử dụng defaultValue không?


120

nếu tôi có một ánh xạ yêu cầu tương tự như sau:

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

Và sau đó gọi yêu cầu này bằng:

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

Tôi nhận được thông báo lỗi

Không thể chuyển đổi giá trị của kiểu 'java.lang.String' thành kiểu 'int'; ngoại lệ lồng nhau là java.lang.NumberFormatException: Đối với chuỗi đầu vào: "" '

Tôi có thể giải quyết vấn đề này bằng cách ngăn ứng dụng khách javascript gửi các tham số trống hoặc bằng cách chấp nhận các giá trị chuỗi và chỉ phân tích cú pháp nếu chúng không được tìm thấy là trống.

CẬP NHẬT : Các phiên bản sau của mùa xuân hiện thực hiện hành vi mong muốn ban đầu.

Tôi vừa thử nghiệm điều này vào mùa xuân 4.3.5 và nhận thấy rằng hành vi bây giờ trên thực tế sẽ biến giá trị null thành giá trị mặc định mà không cần tăng a NumberFormatException, do đó; ánh xạ ban đầu của tôi bây giờ hoạt động tốt.

Tôi không chắc phiên bản nào của mùa xuân mà thay đổi hành vi này được thực hiện.


chắc chắn tham số sẽ là một kiểu Integer để nâng cao ngoại lệ đó?
laher

3
Tôi không phải chuyên gia về mùa xuân, nhưng giá trị mặc định có được sử dụng khi bạn không đặt nó không? tức là nếu yêu cầu của bạn sẽ là example.com/test ? khi bạn sử dụng example.com/test?i= sau đó tôi là hiện tại và thiết lập để "" vì vậy giá trị mặc định không được sử dụng
user902383

Cảm ơn amir75, tình cờ cung cấp Stringloại. user902383, đúng vậy, mặc dù đối với một giá trị số nguyên, tôi muốn giá trị null / rỗng sẽ sử dụng defaultValue thay thế.
Brett Ryan

Câu trả lời:


175

Bạn có thể thay đổi kiểu @RequestParam thành Số nguyên và không bắt buộc. Điều này sẽ cho phép yêu cầu của bạn thành công, nhưng sau đó nó sẽ vô hiệu. Bạn có thể đặt nó thành giá trị mặc định của mình một cách rõ ràng trong phương thức controller:

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

Tôi đã xóa defaultValue khỏi ví dụ trên, nhưng bạn có thể muốn bao gồm nó nếu bạn muốn nhận được các yêu cầu mà nó không được đặt ở tất cả:

http://example.com/test

6
Chỉ là bản cập nhật về điều này, các phiên bản gần đây của mùa xuân thực sự không còn yêu cầu kiểm tra null vì hành vi mong muốn đã được bao gồm với mùa xuân mà các giá trị trống sẽ dẫn đến giá trị mặc định được sử dụng.
Brett Ryan

3
Câu trả lời đã lỗi thời, giải pháp tốt nhất là từ @AppLend
Jose Đưa ra S

101

Bạn có thể giữ kiểu nguyên thủy bằng cách đặt giá trị mặc định, trong trường hợp của bạn chỉ cần thêm thuộc tính "Required = false" :

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

PS Trang này từ tài liệu Spring có thể hữu ích: Loại chú thích RequestParam


1
Cảm ơn nhưng bạn đã bỏ lỡ điểm của câu hỏi của tôi trong tiêu đề. Tôi đã yêu cầu khả năng cung cấp các tham số trống /test?i=và vì itrống có giá trị mặc định.
Brett Ryan

5
Dù sao, khi defaultValueđược cung cấp, required == falsengầm định
Timur Milovanov.

4
Nếu tham số được cung cấp nhưng trống defaultValuekhông có hiệu lực.
Brett Ryan

12

Bạn có thể đặt RequestParam, sử dụng Integer lớp chung thay vì int, nó sẽ giải quyết vấn đề của bạn.

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

1

Bạn cũng có thể làm điều gì đó như thế này -

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

3
Nếu bạn có Giá trị mặc định, bạn không cần phải đặt giá trị này thành Tùy chọn.
Kevin M

1

Đây được coi là một lỗi trong năm 2013: https://jira.spring.io/browse/SPR-10180

và đã được sửa với phiên bản 3.2.2. Sự cố sẽ không xảy ra trong bất kỳ phiên bản nào sau đó và mã của bạn sẽ hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.