2

我正在使用 Apache CXF 框架开发 SOAP Web 服务。我的网络方法根据请求参数返回二进制数据或纯 XML。大多数请求都返回二进制数据,因此我将 CXF 配置为在服务响应中使用 MTOM。

但这并不总是有用的:当返回 XML 时,调用方期望得到纯文本/xml 文档而不是多部分文档。所以我希望我的网络服务能够动态地改变它的绑定。

CXF 文档有以下示例:

端点 ep = ...; // 例子没有说明如何获取
SOAPBinding 绑定 = (SOAPBinding)ep.getBinding();
binding.setMTOMEnabled(true); // 或假

问题:如何获取Endpoint实例?

我将 Spring 注释 @Endpoint 用于 Web 服务,将 @PayloadRoot 用于 Web 方法。

4

2 回答 2

3

如果您使用 on ,您可以使用以下代码server

你需要添加import javax.xml.ws.Endpoint;

HelloWorldImpl implementor = new HelloWorldImpl();
String address = "http://localhost:9000/helloWorld";
Endpoint.publish(address, implementor);

从客户端

TestMtomService tms = new TestMtomService(wsdlURL, SERVICE_NAME);
TestMtomPortType port = (TestMtomPortType)tms.getPort(PORT_NAME,TestMtomPortType.class);
Binding binding = ((BindingProvider)port).getBinding();
((SOAPBinding)binding).setMTOMEnabled(true);

参考

如果您下载了 cxf 包,MTOM服务器/客户端的代码示例可在以下路径中找到

apache-cxf-2.7.2\samples\mtom

于 2013-04-03T03:54:42.147 回答
2

我创建了自己的编组类,从org.springframework.oxm.jaxb.Jaxb2Marshaller. 仅覆盖单个方法:

公共类 Marshaller 扩展 Jaxb2Marshaller {
  @覆盖
  公共无效元帅(对象图,结果结果,MimeContainer mimeContainer)抛出 XmlMappingException {
    if ( disableMtom() ) {
      超级元帅(图,结果,空);
    } 别的 {
      super.marshal(图形,结果,mimeContainer);
    }
  }

  私人布尔disableMtom(){
    return ... // 取决于响应上下文
  }
}

disableMtom检测是否从响应上下文中禁用了 MTOM 。Web 服务端点以某种方式将此上下文传递给编组器。

默认情况下启用 MTOM。

于 2013-05-22T20:24:40.330 回答