Câu hỏi Có thể có các giá trị RequestParam rỗng sử dụng defaultValue không?


nếu tôi có một yêu cầu ánh xạ 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 với:

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 loại 'java.lang.String' thành '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 điều này bằng cách dừng máy 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 để trống.

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

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

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


76
2017-09-06 09:08


gốc


chắc chắn tham số sẽ là một kiểu Integer để tăng ngoại lệ đó? - laher
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ẽ example.com/test ? khi bạn sử dụng example.com/test?i= sau đó tôi có mặt và đặt thành "" để giá trị mặc định không được sử dụng - user902383
Cảm ơn amir75, vô tình được cung cấp String kiểu. user902383, đó là chính xác, mặc dù cho một giá trị số nguyên tôi muốn rằng một giá trị null / trống sẽ sử dụng defaultValue thay thế. - Brett Ryan


Các câu trả lời:


Bạn có thể thay đổi kiểu @RequestParam thành một số nguyên và làm cho nó không cần thiết. Đ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ẽ là rỗng. Bạn có thể đặt nó một cách rõ ràng về giá trị mặc định của bạn trong phương thức điều khiển:

@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 từ ví dụ trên nhưng bạn có thể muốn bao gồm nó nếu bạn mong nhận được các yêu cầu mà nó không được đặt ở tất cả:

http://example.com/test

119
2017-09-22 00:18



Chỉ cần một 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 như hành vi mong muốn đã được bao gồm trong mùa xuân mà giá trị rỗng sẽ dẫn đến giá trị mặc định đang được sử dụng. - Brett Ryan
Câu trả lời lỗi thời, giải pháp tốt nhất là từ @AppLend - Jose Pose S


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 "required = false" bất động sản:

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

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


68
2018-02-20 08:40



Cảm ơn nhưng bạn đã bỏ lỡ câu hỏi của tôi trong tiêu đề. Tôi đã yêu cầu khả năng cung cấp thông số trống /test?i= và kể từ khi i trống rỗng có giá trị mặc định. - Brett Ryan
Dù sao, khi nào defaultValue đã được cung cấp, required == false ngầm - Timur Milovanov
Nếu tham số được cung cấp nhưng trống defaultValue không có hiệu lực. - Brett Ryan
nếu param là danh sách thì sao ??? lâu dài cho exemple !!!! - Mohammed Housseyn Taleb


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

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

3
2018-02-19 09:38





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

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

1
2018-01-19 05:05