2010-11-20 37 views
9

Chúng tôi đang tạo một webservice (CXF-based) được thúc đẩy bởi một lớp java (Java2WS) với phương thức sau:Dịch vụ web với CXF: Cách sử dụng ResponseWrapper?

@WebMethod 
    @RequestWrapper(className = "com.myproject.wrapper.MyRequestWrapper") 
    @ResponseWrapper(className = "com.myproject.wrapper.MyResponseWrapper") 
    public MyResponse verifyCode(@WebParam(name = "code") String code) { 
    ... 
    return new MyResponse("Hello",StatusEnum.okay); 
    } 

tôi sử dụng giấy gói để xác định các yếu tố của resp yêu cầu. phản hồi chi tiết hơn: các tên phần tử chính xác (bắt đầu bằng ký tự chữ hoa), các phần tử bắt buộc và tùy chọn, ...). Nhưng tôi không chắc chắn nếu điều này là đúng cách để làm điều đó (không có chiều sâu tài liệu về hàm bao, phải không?)

Lớp MyResponse:

public class MyResponseWrapper { 

    private String result; 
    private ModeEnum status; 

    // getters and setters 
} 

Lớp MyReponseWrapper

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "myResponse") 
public class MyResponseWrapper { 

    @XmlElement(name="Result") 
    private String result; 

    @XmlElement(name = "Status") 
    private StatusEnum status; 

    public MyResponseWrapper() { 
    result="fu"; // just for testing 
    } 

    // getters and setters 
} 

Hiện tại tôi không hiểu Trình bao bọc. Khi tôi trả về một thể hiện của MyReponse, dữ liệu từ MyResponse được tiêm vào MyResponseWrapper một cách tôn trọng đối với cơ thể SOAP của phản hồi như thế nào?

Bằng cách kiểm tra webservice này, tôi có thể thấy rằng một thể hiện của MyResponseWrapper được khởi tạo và phần tử SOAP chứa các phần tử chính xác nhưng với dữ liệu mặc định (ví dụ: result = "fu" thay vì "Hello"). Tôi hy vọng rằng CXF sẽ tiêm dữ liệu phù hợp từ MyResponse vào MyResponseWrapper. Là sai đó?

Nếu đây là cách sai để thực hiện: Wat là cách đúng để chỉ định kết quả Xml SOAP khi sử dụng Java2WS?

Nhân tiện: Đoạn mã nguồn ở trên chỉ là các ví dụ được lấy từ các lớp phức tạp hơn (nhiều trường khác) của chúng tôi.

Trả lời

-1

Đây là cách phù hợp để thực hiện. Trình bao bọc yêu cầu và đáp ứng chỉ cho phép ghi đè vùng tên xml và tên phần tử/thuộc tính cho các phần tử yêu cầu/phản hồi; tương ứng - lần lượt ánh xạ tới các phương thức được sử dụng để quản lý các giá trị đó.

Ref: http://cxf.apache.org/docs/developing-a-service.html#[email protected]pperannotation

Chú thích @RequestWrapper được xác định bởi giao diện javax.xml.ws.RequestWrapper. Nó được đặt trên các phương pháp trong SEI. Như tên ngụ ý, @RequestWrapper chỉ định lớp Java thực hiện bean wrapper cho các tham số phương thức được bao gồm trong thông báo yêu cầu được gửi trong một lời gọi từ xa. Nó là cũng được sử dụng để chỉ định tên phần tử và không gian tên, được sử dụng bởi thời gian chạy khi marshalling và unmarshalling các thông điệp yêu cầu.

Bảng sau đây mô tả các thuộc tính của chú thích @RequestWrapper .

localName

Chỉ định tên địa phương của phần tử wrapper trong sự biểu diễn XML của thông điệp yêu cầu. Giá trị mặc định là tên của phương thức hoặc giá trị của thuộc tính hoạt động của @WebMethod.

targetNamespace

Chỉ định namespace theo đó các yếu tố wrapper XML là xác định. Giá trị mặc định là không gian tên đích của SEI.

className

Chỉ định tên đầy đủ của lớp Java bổ sung yếu tố wrapper.

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