2010-11-20 179 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类的全名。