在Apache CXF中动态设置启用MTOM的属性

时间:2013-04-02 18:56:22

标签: web-services cxf

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

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

CXF文档有以下示例:

Endpoint ep = ...; // example does not explain how to get it
SOAPBinding binding = (SOAPBinding)ep.getBinding();
binding.setMTOMEnabled(true); // or false

问题:如何获得Endpoint实例?

我正在使用Spring注释@Endpoint进行网络服务,使用@PayloadRoot进行网络方法。

2 个答案:

答案 0 :(得分:3)

如果您使用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 \样品\ MTOM

答案 1 :(得分:2)

我创建了自己的org.springframework.oxm.jaxb.Jaxb2Marshaller扩展的编组类。只覆盖一种方法:

public class Marshaller extends Jaxb2Marshaller {
  @Override
  public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException {
    if ( disableMtom() ) {
      super.marshal(graph, result, null);
    } else {
      super.marshal(graph, result, mimeContainer);
    }
  }

  private boolean disableMtom() {
    return ... // depends on response context
  }
}

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

默认启用MTOM。