2010-08-11 31 views
6

Xin lỗi vì đã đặt một câu hỏi đơn giản như vậy ở đây vì tôi mới làm quen với Spring MVC 3.0. Tôi đã đọc tài liệu từ trang web nguồn xuân một vài lần. Dưới đây là một đoạn mã mà tôi sẽ đề cập đến cho câu hỏi của tôi dưới đây: -Spring MVC 3.0: Chuỗi có phải là loại ưa thích được sử dụng cho @PathVariable không?

@RequestMapping("/pets/{petId}") 
public void findPet(@PathVariable String petId, Model model) {  
// implementation omitted 
} 

Nếu tôi có ý định sử dụng mẫu URI dựa trên ví dụ này, là nó luôn luôn thích hợp hơn để thiết lập kiểu @PathVariable để là String mặc dù tôi hy vọng nó là loại khác, chẳng hạn như, một int? Tài liệu nói rằng chú thích @PathVariable có thể là bất kỳ kiểu đơn giản nào, nhưng nếu Spring không thể chuyển đổi petId không hợp lệ thành một int (ví dụ, người dùng nhập một số ký tự thay vì số), nó sẽ ném một TypeMismatchException.

Vì vậy, khi nào trình xác thực đi vào hoạt động? Tôi có để lại tất cả các loại @PathVariable thành String và có trình xác nhận hợp lệ để thực hiện xác thực trên các giá trị String hay không và nếu không có lỗi xác thực, thì chuyển đổi một cách rõ ràng Chuỗi thành loại mong muốn?

Cảm ơn bạn.

Trả lời

6
  1. Hãy để @PathVariable là loại mà bạn mong đợi, không nhất thiết String
  2. Có một trang lỗi cũng tùy chỉnh. Nếu người dùng quyết định viết một cái gì đó trong URL, anh ta phải nhận thức được "hậu quả".
+0

Cách tiếp cận này hoạt động nếu người sử dụng xây dựng các URL thân. Tuy nhiên, tôi không chắc chắn làm thế nào điều này sẽ làm việc nếu giá trị cho petId đến từ một trường văn bản mở được gửi từ một biểu mẫu. – limc

+1

thì đó không phải là '@ PathVariable', mà là' @ RequestParam'. Và xác nhận phải được thực hiện phía máy khách, ngoài máy chủ – Bozho

+0

Cảm ơn lời giải thích sâu sắc của bạn, tôi đoán tôi đã nhầm lẫn giữa @pathvariable và @requestparam. – limc

7

Bạn nói

nhưng nếu mùa xuân là không có khả năng chuyển đổi không hợp lệ petId thành một int, nó sẽ ném một TypeMismatchException.

Ok. Nhưng bạn có thể xử lý các trường hợp ngoại lệ huy động trong bộ điều khiển thông qua các chú thích @ExceptionHandler nếu bạn muốn

@ExceptionHandler(TypeMismatchException.class) 
public String handleIOException(TypeMismatchException e, HttpServletRequest request) { 
    // handle your Exception right here 
} 

@ExceptionHandler xử lý phương pháp chữ ký là flexibe, Xem here

+0

và upvote của tôi cho bạn đi về @ExceptionHandler, mà tôi không biết;) – Bozho

+0

Có nó như String và bắt ngoại lệ có kiểm soát nhiều hơn đánh bắt tất cả TypeMismatchException.class nếu tôi muốn thông báo lỗi khác nhau nếu tôi gọi khác nhau phương pháp? –

Các vấn đề liên quan