2012-02-23 24 views
5

Chúng tôi sử dụng cxf 2.5.2 cùng với mùa xuân để trưng ra và tiêu thụ các dịch vụ an toàn. Để phân phối các lớp giao diện dịch vụ, chúng tôi bắt đầu sử dụng mục tiêu wadl2java (tạo các lớp giao diện dựa trên tệp wadl đã cho)CXF JAXRS | Các kiểu phản ứng phức tạp không có trong wadl

Wadl được tạo không chứa loại phản hồi phù hợp, vì tôi đoán là các giao diện đã tạo 'Phản hồi' làm kiểu trả về.

Ví dụ: nếu get phương pháp lợi nhuận yên tĩnh 'Danh sách', các wadl tạo ra chỉ chứa các phân đoạn sau:

<response><representation mediaType="application/json"/></response>

và giao diện tương ứng được tạo ra từ file wadl này chứa các kiểu trả về là 'đáp ứng'

Can ai đó đề xuất những gì cần phải được thực hiện để ngăn chặn các loại phản ứng thực tế từ bị mất? Có bất kỳ chú thích nào (như ElementClass không? Cách sử dụng nó?) Hoặc các nhà cung cấp được yêu cầu?

đang hiện tại:

@GET 
@Path("/itemsForCategory") 
@Produces("application/json") 
@Description("getItemsForCategory") 
public List<Item> getItemsForCategory(@QueryParam("category")String category) { 
+0

Tìm thấy http://cxf.547215.n5.nabble.com/Problem-with-WADL-generation-and-returning-a-List-of-objects-td4713351.html#a5507490. Không chắc chắn nếu nó đã được sửa chữa – crankparty

Trả lời

-1

Tôi có vấn đề tương tự khi giao dịch với các danh sách, bản đồ vv Bởi vì các bộ sưu tập không biết loại của họ trong thời gian chạy khi tạo một WSDL các loại mà bạn đưa vào bộ sưu tập sẽ được bỏ qua . Ngoại lệ cho điều này, tôi thấy, là khi một phương pháp tiếp cận dịch vụ web khác sử dụng loại đặc biệt đó. Là một công việc xung quanh tôi đã tạo ra một phương pháp giả sử dụng mọi loại tôi cần cho danh sách và bản đồ.

Vì vậy, ví dụ, tôi đã có một lớp được gọi là Người dùng mở rộng một lớp trừu tượng được gọi là BaseObject không được sử dụng trực tiếp bởi webservice. Tuy nhiên, đôi khi nó được chuyển qua danh sách khi tìm kiếm người dùng. Mã sau đây là giải pháp của tôi.

@WebService 
public interface MyService 
{ 
    // Various @WebMethods here 

    /** 
    * This method should not be used. This is a workaround to ensure that 
    * User is known to the JAXB context. Otherwise you will get exceptions like this: 
    * javax.xml.bind.JAXBException: class java.util.User nor any of its super class is known to this context. 
    * Or it will assume that using BaseObject is OK and deserialisation will fail 
    * since BaseObject is abstract. 
    * This issue occurs because the classes available to the JAXB context 
    * are loaded when the endpoint is published. At that time it is not known 
    * that User will be needed since it is not explicitly referenced 
    * in any of these methods. Adding user here will cause it to be added to 
    * the context. 
    * @param user 
    * @return 
    */ 
    @WebMethod 
    void dummy(@WebParam(name="user") User user); 
} 

Tôi thừa nhận đây là một công việc khó chịu và tôi không coi đó là một giải pháp thích hợp, nhưng có thể nó sẽ giúp bạn tiếp tục cho đến khi ai đó có thể cung cấp giải pháp tốt hơn.

Hy vọng điều này sẽ hữu ích.

2

Loại trả về "Phản hồi" chung dường như không liên quan đến thực tế là bạn đang cố trả lại danh sách. Tức là, ngay cả khi sử dụng "Item" làm kiểu trả về sẽ dẫn đến một phương thức trong giao diện được tạo ra với kiểu trả về là "Response". Để khắc phục điều này, bạn cần phải thêm thuộc tính nguyên tố trong phản ứng nguồn WADL:

<response><representation mediaType="application/json" element="item"/></response> 

này hoạt động nếu bạn sửa đổi WADL trực tiếp, tương đương JAX-RS chú thích có thể hoặc không được hỗ trợ. Điều này cũng không giải quyết được vấn đề của bạn khi trả về một danh sách. Đề xuất của tôi (mà trước đây tôi đã sử dụng) là tạo một loại danh sách trình bao bọc (ví dụ: ItemList) đóng gói kiểu trả về của Danh sách.

Trong cả hai trường hợp, bạn sẽ cần phải lật từ dưới lên trên để thực hiện từ trên xuống (tức là, WADL trước). Điều này không nên quá xấu, vì bạn đã có triển khai và bạn chỉ có thể làm cho nó triển khai giao diện được tạo.

Để làm rõ tất cả điều này, tôi đã thực hiện một dự án ví dụ đơn giản dựa trên ví dụ "Nhà sách" JAX-RS tiêu chuẩn. Bạn có thể xem pom (với cấu hình wadl2java) và wadl thực tế trên github. Mã được tạo cũng có sẵn (ví dụ: BookstoreidResource.java).

+0

Repo không tồn tại nữa –

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