@RequestParam trong Spring MVC xử lý các tham số tùy chọn


184

Bộ điều khiển Spring có thể xử lý cả hai loại yêu cầu không?

1) http://localhost:8080/submit/id/ID123432?logout=true

2) http://localhost:8080/submit/id/ID123432?name=sam&password=543432

Nếu tôi xác định một bộ điều khiển duy nhất của loại:

 @RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout", required = false) String logout,
                              @RequestParam("name") String username,
                              @RequestParam("password") String password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

yêu cầu HTTP với "đăng xuất" không được chấp nhận.

Nếu tôi xác định hai bộ điều khiển để xử lý riêng từng yêu cầu, Spring sẽ phàn nàn với ngoại lệ "Đã có phương thức bean 'Bộ điều khiển' ... được ánh xạ".


2
Đọc bài viết này: codeflex.co/ từ
ybonda

Câu trả lời:


224

Bạn cần phải cung cấp required = falsecho namepasswordyêu cầu các tham số là tốt. Đó là bởi vì, khi bạn chỉ cung cấp logouttham số, nó thực sự mong đợi namepasswordcũng như chúng vẫn là bắt buộc.

Nó hoạt động khi bạn vừa cho namepasswordlogoutkhông phải là tham số bắt buộc nhờ required = falseđã được đưa ra logout.


167

Là một phần Spring 4.1.1trở đi, giờ đây bạn có hỗ trợ đầy đủ cho Java 8 Optional( vé gốc ), do đó, trong ví dụ của bạn, cả hai yêu cầu sẽ đi qua điểm cuối ánh xạ duy nhất của bạn miễn là bạn thay thế required=falsebằng Tùy chọn cho đăng xuất 3 tên, mật khẩu:

@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout") Optional<String> logout,
                              @RequestParam("name") Optional<String> username,
                              @RequestParam("password") Optional<String> password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

2
@VibhavChaddha bạn có thể sử dụng một cái gì đó như thế này: if (idOfUser.isPftime ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
Cassio Seffrin

10
Cảnh báo Intellij: 'Tùy chọn <Long>' được sử dụng làm loại cho tham số 'RequestTimelineStart' ít hơn ... (Strg + F1) Thông tin kiểm tra: Báo cáo mọi sử dụng của java.util.Optional <T>, java.util.OptionalDouble, java. produc.OptionalInt, java.util.OptionalLong hoặc com.google.common.base.Optional là loại cho một trường hoặc một tham số. Tùy chọn được thiết kế để cung cấp một cơ chế giới hạn cho các kiểu trả về phương thức thư viện khi cần có một cách rõ ràng để biểu thị "không có kết quả". Việc sử dụng một trường với loại java.util.Optional cũng có vấn đề nếu lớp cần phải được Nối tiếp, mà java.util.Optional thì không.
PeMa

Tôi tin rằng đây là câu trả lời đúng với Java 8.
java-nghiện602

40

Tạo 2 phương thức xử lý các trường hợp. Bạn có thể hướng dẫn @RequestMappingchú thích để tính đến các tham số nhất định trong khi ánh xạ yêu cầu. Bằng cách đó, bạn có thể chia thành 2 phương thức này.

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"logout"})
public String handleLogout(@PathVariable("id") String id, 
        @RequestParam("logout") String logout) { ... }

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"name", "password"})
public String handleLogin(@PathVariable("id") String id, @RequestParam("name") 
        String username, @RequestParam("password") String password, 
        @ModelAttribute("submitModel") SubmitModel model, BindingResult errors) 
        throws LoginException {...}

1
Điều gì sẽ xảy ra khi ai đó chuyển cả đăng xuất, tên và mật khẩu vào URL? Chỉ cần đọc tài liệu, nó nói !myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.phải thử.
người mang nhẫn

2
Nó sẽ tìm thấy kết quả phù hợp nhất, nó có thể sẽ cố gắng sử dụng cái handleLoginkhác nó sẽ đưa ra một ngoại lệ cho biết không thể tìm thấy ánh xạ.
M. Deinum

3
Chỉ cần một lưu ý: từ đăng xuất quan điểm bảo mật chỉ nên chấp nhận các yêu cầu POST, do đó, nên có 2 phương thức và sẽ không có ý nghĩa gì khi giữ URL của chúng giống nhau.
FlasH từ Ru
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.