【问题标题】:Webservice with CXF: How to use the ResponseWrapper?带有 CXF 的 Web 服务:如何使用 ResponseWrapper?
【发布时间】:2011-05-13 00:41:11
【问题描述】:

我们正在使用以下方法创建由 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);
  }

我使用包装器来定义请求的元素。更详细的响应:正确的元素名称(以大写字符开头),必需和可选元素,...)。但我不确定这是否是正确的方法(没有关于包装器的深入文档,不是吗?)

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 的正确方法吗?

顺便说一句:上面的源 sn-ps 只是取自我们更复杂(更多字段)类的示例。

【问题讨论】:

    标签: java web-services response wrapper cxf


    【解决方案1】:

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

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

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

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

    本地名称

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

    目标命名空间

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

    类名

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

    【讨论】:

    • className 属性的包名与类不同。尽管全名不同,但 webclient 正在工作。可能是什么原因??示例:@WebMethod @RequestWrapper(className = "myproject.com.wrapper.MyRequestWrapper") @ResponseWrapper(className = "myproject.com.wrapper.MyResponseWrapper") public MyResponse verifyCode(@WebParam(name = "code") String code) { ... return new MyResponse("Hello",StatusEnum.okay); }
    猜你喜欢
    • 2020-06-28
    • 2015-09-03
    • 1970-01-01
    • 2015-04-10
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多