2013-08-27 63 views
13

Tôi muốn có nhiều chức năng cho cùng một Đường dẫn GET.Chức năng đường dẫn quá tải với @QueryParams

Tôi cũng muốn dịch vụ web của mình "tìm" các hàm này nếu và chỉ khi tham số truy vấn khớp với các tham số trong chuỗi URL.

Ví dụ:

Tôi có Path("/myGET")

Và đối với con đường mà tôi muốn có 2 chức năng:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(@QueryParam("entityId") Integer entityId) 
{ 
    ... 
} 

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(){ 
    ... 
} 

Ngay bây giờ tôi đang gặp lỗi:

SEVERE: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer) and public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets() and public javax.ws.rs.core.Response <...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type

Vì vậy, đầu tiên: Có cách nào để đạt được những gì tôi muốn làm ở đây ..

thứ hai: Nếu đây là có sẵn, có cách nào mà một con đường sẽ được tìm thấy khi và chỉ khi các tham số truy vấn khớp chính xác với những gì được yêu cầu trong hàm? ví dụ, nếu cùng một đường dẫn sẽ được gọi với @QueryParam("differentParam") nó sẽ không đạt được bất kỳ trong số 2 chức năng.

Thứ ba: Nếu không có cách nào để thực hiện việc này với Jersey, có cách nào để thực hiện việc này với bất kỳ công việc khung nào khác không ?.

QUAN TRỌNG: Khi mọi người trả lời câu hỏi nghĩ rằng tôi đang tìm kiếm một công việc xung quanh chứ không phải giải pháp. hôm nay tôi đang sử dụng 1 chức năng và kiểm tra các tham số và gọi những gì tôi cần từ này (đó là những gì tôi sử dụng trước khi tôi đăng câu hỏi). Nhưng những gì tôi đang tìm kiếm là có thể sử dụng sức mạnh của khung công tác để cứu tôi rắc rối

Cảm ơn.

+0

Tôi nghĩ rằng bạn, sẽ phải làm điều đó trong một phương pháp duy nhất và programatically quyết định những gì phương pháp khác để gọi dựa trên sự hiện diện của các tham số truy vấn . Tôi không nghĩ rằng điều này có thể được quyết định chỉ dựa trên các thông số truy vấn. –

+0

Tất cả các câu trả lời đều đề cập đến việc triển khai hiện tại của tôi. Vì vậy, tôi hiểu từ tất cả các bạn rằng không có cách nào để làm những gì tôi đang tìm kiếm với áo ... bạn có biết nếu có cách nào để làm điều đó với mùa xuân? – Gleeb

+0

Bạn đã yêu cầu một phương thức có tham số truy vấn khác nhau và câu trả lời của tôi là sử dụng Jersey. Chính xác thì bạn đang tìm điều gì? Làm rõ câu hỏi của bạn. – anvarik

Trả lời

2

Cách duy nhất được mô tả trong các nhận xét. Bạn có thể sử dụng một phương thức duy nhất khai báo tất cả các tham số truy vấn và sau đó dựa trên các giá trị (tồn tại hay không), gọi phương thức đúng.

(Làm việc xung quanh cách tiếp cận) Nếu tất cả những gì bạn muốn là hiển thị một điểm cuối với nhiều tham số truy vấn cho khách hàng và thực thi mã không quan trọng, bạn có thể sử dụng bộ chặn. đọc tham số truy vấn và sửa đổi URI để chuyển nó tới phương thức thích hợp.

4

Tài nguyên được xác định duy nhất bởi đường dẫn và không theo thông số của nó. Hai tài nguyên bạn đã xác định có cùng đường dẫn. Bạn có thể xác định đường dẫn mới cho mỗi người trong số họ như /myGet/entity, /myGet/, /myGet/differentParam; hoặc sử dụng một con đường duy nhất là /myGet/ và kiểm tra các params truy vấn như sau:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(@Context HttpServletRequest request){ 

     ... 

     if (request.getParameterMap().isEmpty()) { 
      // then you have no query params, implement as there are no query params 
     } else { 
      String queryParam = request.getQueryString(); 
      // check queryParam, and add another if else statements, implement 
     } 

     ... 

} 
+0

Vì vậy, câu trả lời vẫn như cũ. Không có cách nào để làm những gì tôi muốn với Jersey, có cách nào để làm điều đó với bất kỳ khuôn khổ nào khác không? – Gleeb

+0

Tôi không sử dụng bất kỳ khung công tác dịch vụ web nào khác nên không thể nói gì về chúng nhưng thực sự thú vị khi bạn muốn chuyển sang một khung công tác hoàn toàn mới thay vì thực hiện thêm một vài dòng trong phương thức – anvarik

+0

Bạn đang đi đến kết luận, 1: bạn không có ý tưởng khối lượng của webapp của tôi, điều này cũng có thể chỉ là một POC. 2: Một phần của câu hỏi này là dành cho việc học và không chỉ giải quyết vấn đề này. – Gleeb