2012-09-06 27 views
65

nếu tôi có aa lập bản đồ theo yêu cầu tương tự như sau:Có thể có các giá trị RequestParam rỗng sử dụng defaultValue không?

@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 gõ 'java.lang.String' để gõ '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 thông số trống hoặc chấp nhận giá trị chuỗi và chỉ phân tích cú pháp nếu không tìm thấy để trống.

CẬP NHẬT: 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 giờ đây thực tế sẽ biến giá trị rỗng thành giá trị mặc định mà không tăng 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 phiên bản nào của mùa xuân thay đổi hành vi này đã được thực hiện.

+0

chắc chắn tham số sẽ là loại Integer để tăng ngoại lệ đó? – laher

+3

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

+0

Cảm ơn amir75, vô tình cung cấp loại 'Chuỗi'. 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ế. –

Trả lời

101

Bạn có thể thay đổi loại @RequestParam thành Số nguyên và làm cho nó 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ẽ là rỗng. Bạn có thể đặt rõ ràng giá trị mặc định của mình theo phương pháp đ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 giá trị mặc địnhValue từ ví dụ trên, nhưng bạn có thể bao gồm giá trị mặc định nếu bạn không nhận được yêu cầu tại tất cả:

http://example.com/test 
+3

Chỉ cầ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 trong mùa xuân mà giá trị trống sẽ dẫn đến giá trị mặc định đang được sử dụng. –

+1

Câu trả lời lỗi thời, giải pháp tốt nhất là từ @AppLend –

57

bạn có thể giữ kiểu nguyên thủy bằng cách thiết lập giá trị mặc định, trong trường hợp của bạn chỉ cần thêm "yêu cầu = false" tài sản:

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

P.S. Trang này từ tài liệu Mùa xuân có thể có ích: Annotation Type RequestParam

+0

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 các tham số rỗng '/ test? I =' và vì 'i' rỗng có giá trị mặc định. –

+1

Dù sao, khi '' 'defaultValue''' được cung cấp,' '' required == false''' hoàn toàn –

+3

Nếu tham số được cung cấp nhưng rỗng 'defaultValue' không có hiệu lực. –

0

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

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

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

@RequestParam(value= "i", defaultValue = "20") Integer i 
Các vấn đề liên quan