繁体   English   中英

Web服务与CXF:如何使用ResponseWrapper?

[英]Webservice with CXF: How to use the ResponseWrapper?

我们正在使用以下方法创建一个由java类(Java2WS)驱动的Web服务(基于CXF):

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

目前我不了解Wrappers。 当我返回MyReponse的一个实例时,MyResponse的数据如何被分别注入MyResponseWrapper到响应的SOAP主体?

通过测试这个Web服务,我可以看到MyResponseWrapper的实例被实例化,SOAP主体包含正确的元素,但是包含默认数据(例如:result =“fu”而不是“Hello”)。 我预计CXF会将MyResponse的匹配数据注入MyResponseWrapper。 那是错的吗?

如果这是错误的方法:在使用Java2WS时,Wat是指定生成的SOAP xml的正确方法吗?

顺便说一下:上面的源代码片段只是从我们更复杂(更多字段)类中获取的示例。

这是正确的方法。 请求和响应包装器只允许覆盖请求/响应元素的xml命名空间和元素/属性名称; - 分别映射到用于管理这些值的方法。

参考: http//cxf.apache.org/docs/developing-a-service.html#DevelopingaService-The@RequestWrapperannotation

@RequestWrapper注释由javax.xml.ws.RequestWrapper接口定义。 它被放置在SEI中的方法上。 顾名思义,@ RequestWrapper指定实现包装在远程调用中发送的请求消息中的方法参数的包装bean的Java类。 它还用于指定运行时在编组和解组请求消息时使用的元素名称和名称空间。

下表描述了@RequestWrapper注释的属性。

的localName

指定请求消息的XML表示形式中包装元素的本地名称。 默认值是方法的名称或@WebMethod注释的operationName属性的值。

目标名称

指定定义XML包装器元素的名称空间。 默认值是SEI的目标命名空间。

班级名称

指定实现包装元素的Java类的全名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM