我正在使用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进行网络方法。
答案 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。