2012-04-29 35 views
11

Tôi muốn kích hoạt trang 404 bất cứ khi nào tôi không được chuyển tất cả các tham số. Giả sử tôi có URI sau:Spring MVC - cách trả về 404 trên các tham số bị thiếu

/myapp/op?param1=1&[email protected]=3 

Trong trường hợp các tham số không được gọi, tôi muốn trả lại trang 404. Tôi đã thử thực hiện:

@ResponseStatus(HttpStatus.NOT_FOUND) 
@RequestMapping(value = "op", params = { "!param1" }) 
public void missingArg() { 
} 

nhưng sau đó tôi có ngoại lệ cho biết có sự mơ hồ giữa các phương thức xử lý tham số thứ hai và thứ ba bị thiếu.

Tôi làm cách nào để thực hiện điều này?

Trả lời

27

Nếu bạn đang sử dụng Spring 3.1 bạn có thể định nghĩa một lớp ngoại lệ như vậy:

@ResponseStatus(value = HttpStatus.NOT_FOUND) 
public final class ResourceNotFoundException extends RuntimeException { 
    // class definition 
} 

Bây giờ bất cứ khi nào bạn ném ngoại lệ đó, mùa xuân sẽ trở lại tình trạng quy định tại http @ResponseStatus chú thích của mình. Ví dụ:

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam(value = "param1", required = false) String param1, 
     @RequestParam(value = "param2", required = false) String param2) { 
    if (param1 == null || param2 == null) { 
    throw new ResourceNotFoundException(); 
    } 
} 

sẽ trả về một 404 bất cứ khi nào param1 hoặc param2 là null.

+0

Cảm ơn, điều đó đã hiệu quả. Mặc dù giải pháp này có vẻ hơi khó xử với tôi nhưng công việc đã hoàn thành. – s0li

+0

Làm thế nào để bạn có được cơ thể/trọng tải tùy chỉnh –

7

Bạn không phải triển khai chức năng missingArg(). Nếu không có phương thức khớp nào cho yêu cầu gửi đến, thì HandlerExceptionResolver của Spring sẽ xử lý nó và trả về phản hồi với mã trạng thái thích hợp.

mùa xuân sẽ tự động chuyển đổi các thông số yêu cầu vào các thông số phương pháp nếu bạn sử dụng @RequestParam chú thích:

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam("param1") String param1, 
     @RequestParam("param2") String param2, 
     @RequestParam("param3") String param3) { 

    // do something with params 
} 

Theo quy ước, phương pháp methodWithRequestParams() sẽ không được gọi là nếu không phải tất cả params là một phần của yêu cầu (trừ trường hợp required thuộc tính của @RequestParam được đặt thành false).

Cũng lưu ý rằng các tham số không phải là Chuỗi.

+0

Vấn đề với điều này là mã repsonse là 400 (hoặc một cái gì đó khác 404) - Tôi không có quyền kiểm soát mã phản hồi hoặc trang nào được trả về. – s0li

+8

Vâng, một yêu cầu «400 - Bad' là theo tôi, mã phản hồi chính xác hơn là' 404'. Sau khi tất cả tài nguyên (được xác định bằng url '/ op') tồn tại, nhưng các tham số yêu cầu là sai, tức là một yêu cầu không hợp lệ. Nếu bạn muốn một tài nguyên cụ thể và phản hồi '404' nếu nó không tồn tại, tôi khuyên bạn nên sử dụng' @RequestMapping ("/ op/{id}") 'kết hợp với [@PathVariable] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates) chú thích. – matsev

1

Cho biết những gì matsev được nêu trong các nhận xét của câu trả lời khác, bạn không nên sử dụng @ResponseStatus(HttpStatus.NOT_FOUND) trong trường hợp này, mà là @ResponseStatus(HttpStatus.BAD_REQUEST).

@ResponseStatus(HttpStatus.NOT_FOUND) nên được sử dụng khi yêu cầu được tạo đúng cách, nhưng tài nguyên không có ở đó.

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