2012-04-04 35 views
7

Tôi có một dịch vụ web được viết bằng Spring MVC. Nó có thể được sử dụng bởi các nhà phát triển bên thứ 3. Phương pháp của chúng tôi có rất nhiều thông số tùy chọn (được chuyển trong chuỗi truy vấn).Spring MVC - Cách kiểm tra xem không có tham số chuỗi truy vấn không mong muốn nào đã được chuyển?

Tôi muốn đảm bảo rằng tất cả thông số chuỗi truy vấn được viết đúng chính tả và không có lỗi chính tả. Có cách nào dễ dàng để làm điều đó không? Ví dụ phương pháp chữ ký:

@RequestMapping(value = {"/filter"}, method = RequestMethod.GET) 
    @ResponseBody 
    public List<MetricType> getMetricTypes( 
      @RequestParam(value = "subject", required = false) Long subjectId, 
      @RequestParam(value = "area", required = false) Long areaId, 
      @RequestParam(value = "onlyImmediateChildren", required = false) Boolean onlyImmediateChildren, 
      @RequestParam(value = "componentGroup", required = false) Long componentGroupId  
      ) throws Exception 
    { 
     //Some code 
    } 

Nếu ai đó gọi phương pháp này với "onlyImediateChildren = true" tham số (một lỗi đánh máy) thay vì "onlyImmediateChildren = true", Spring MVC sẽ bỏ qua các tham số typoed và sẽ cho rằng "onlyImmediateChildren" là null . Nhà phát triển sẽ nhận được danh sách kết quả không chính xác một chút và sẽ không nhận thấy lỗi. Những vấn đề như vậy có thể phổ biến và khó chẩn đoán. Tôi muốn kiểm tra không có params typoed trong chuỗi truy vấn để ngăn chặn các vấn đề như vậy.

CẬP NHẬT

Có thể trích xuất danh sách thông số thực tế từ chuỗi truy vấn. Sau đó, nó có thể được so sánh với danh sách các tham số cho phép. Nếu tôi mã hóa danh sách tham số được phép, nó sẽ sao chép chữ ký phương thức. Tôi tự hỏi liệu có dễ dàng trích xuất danh sách các thông số được phép từ chữ ký phương thức hay không (ví dụ: bằng chú thích @RequestParam)?

Rất cám ơn

Maxim

+0

Bạn đang sử dụng phiên bản Spring nào? –

+0

Bạn có nghĩa là spring MVC? Tôi sử dụng tệp có tên "Spring-webmvc.3.0.5.Release.jar." –

Trả lời

4

Bạn có thể thực hiện riêng HandlerInterceptor của bạn. Trong phương thức preHandle, bạn có thể lấy tất cả các tham số của HandlerMethod được chú thích bằng @RequestParameter. Đây sẽ là tất cả các tham số được phép theo yêu cầu.

+0

Có vẻ thú vị. Sẽ cố gắng thực hiện. Tôi hy vọng nó sẽ làm việc. –

1

Bạn có thể sử dụng phương pháp getParameterMap được yêu cầu để có được một Map của tất cả các thông số gửi, và kích hoạt các phím chống lại một danh sách tất cả các thông số cho phép. Bạn sẽ có thể để có được những đối tượng request bằng cách đơn giản thêm nó vào chữ ký phương pháp, ví dụ .:

public List<MetricType> getMetricTypes( 
    HttpServletRequest request, 
    @RequestParam(value = "subject", required = false) Long subjectId, 
    ... 
) throws Exception { 
+0

Cảm ơn bạn vì điều đó! Những gì tôi đang cố gắng làm là để tránh hardcoding/nhân đôi một danh sách các tham số cho phép. Danh sách này đã được chỉ định bằng chữ ký phương thức. Tôi muốn trích xuất một danh sách các tham số được phép từ chữ ký phương thức. –

+0

Thay vì gọi 'request.getParameterMap', bạn có thể sử dụng tham số phương thức' @RequestParam Map paramMap' – soulcheck

+0

@MaximEliseev Cách dễ nhất là yêu cầu khách hàng cung cấp tất cả các tham số, nhưng để trống khi chúng ' không cần thiết kể từ đó bạn có thể sử dụng 'params'' 'của RequestMapping' để đảm bảo rằng chỉ có các tham số đã cho.Ngoài ra, bạn có thể mở rộng 'AnnotationMethodHandlerAdapter' (hoặc một số lớp liên quan khác; tôi không chắc chắn) để thực hiện xác thực tham số của bạn. – beerbajay

1

mùa xuân sẽ bơm tất cả các tham số truy vấn hiện diện trong chuỗi url qua đối số kiểu

@RequestParam Map<String,String> trong phương pháp điều khiển của bạn, nếu có.

@RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/json"}) 
public HttpEntity<PagedResources<WebProductResource>> findAll(@RequestParam Map<String, String> allRequestParams){ 
... 

}

Sau đó bạn có thể xác nhận các phím của bản đồ cho mình. Để có cách "enterprisey" để làm điều đó một cách tổng quát, hãy xem câu trả lời của tôi ở đây: How to check spring RestController for unknown query params?

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