2010-11-20 201 views
9

我們正在建立一個web服務(基於CXF)由一個Java類(Java2WS)用下面的方法驅動:Web服務與CXF:如何使用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); 
    } 

我使用包裝來定義請求RESP的元素。更詳細的響應:正確的元素名稱(以大寫字母開頭),必需和可選元素,...)。但我不知道這是做正確的方式(沒有深入瞭解包裝的文檔,不是嗎?)

類MyResponse:

public class MyResponseWrapper { 

    private String result; 
    private ModeEnum status; 

    // getters and setters 
} 

類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 
} 

目前我不明白包裝。當我返回一個MyReponse的實例時,MyResponse的數據如何被分別注入到響應的SOAP主體中?

通過測試這個web服務,我可以看到MyResponseWrapper的一個實例被實例化,並且SOAP正文包含正確的元素,但包含默認數據(例如:result =「fu」而不是「Hello」)。我預計CXF會將來自MyResponse的匹配數據注入MyResponseWrapper。那是錯的嗎?

如果這是錯誤的方式: 使用Java2WS時,Wat是指定生成的SOAP xml的正確方法嗎?

順便說一句:上面的源代碼片段只是從我們更復雜(更多字段)類中取得的例子。

回答

-1

這是正確的做法。 請求和響應包裝器只允許覆蓋請求/響應元素的xml名稱空間和元素/屬性名稱;分別映射到用於管理這些值的方法。

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

的@RequestWrapper註釋由 javax.xml.ws.RequestWrapper接口定義。它被放置在SEI的 中。如名稱所示,@RequestWrapper指定Java類 ,該類爲在遠程調用中發送的請求消息中包含的 方法參數實現包裝bean。 還用於指定編組和解組請求消息時由 運行時使用的元素名稱和名稱空間。

下表描述了@RequestWrapper 註釋的屬性。

的localName

指定在請求消息中的XML 表示包裝元素的本地名稱。缺省值是該方法的名稱 或@WebMethod註釋的 operationName屬性的值。

的targetNamespace

指定的命名空間在其下XML包裝元件是定義 。缺省值是SEI的目標名稱空間。

的className

指定實現包裝 元素的Java類的全名。