MTOM可以在SOAP消息中传输二进制数据,与SAAJ传输附件不同,MTOM需要XOP来传输二进制数据。MTOM允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起发送。MTOM消息会打包为多部分相关MIME序列,放在SOAP消息中一起发送。因此你可以看出MTOM并不是将附件转为Base64编码,这样可以大大的提高性能,因为二进制文件转Base64编码会非常庞大。
package com.nantian.service; import java.util.Date; import javax.activation.DataHandler; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Customer") @XmlAccessorType(XmlAccessType.FIELD) public class Customer { private long id; private String name; private Date birthday; @XmlMimeType("application/octet-stream") private DataHandler imageData; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public DataHandler getImageData() { return imageData; } public void setImageData(DataHandler imageData) { this.imageData = imageData; } }
这里我们看到MTOM方式中要传输的附件必须使用javax.xml.bind.annotation.XmlMimeType进行注解,标注这是一个附件类型的数据,这里我们标注imageData是一个二进制数据,当然你也可以使用具体的MIME类型,譬如:image/jpg、image/gif等,但你要考虑客户端是否有相对应的类型。
这里你要注意的是必须在类上使用javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlMimeType.FIELD)注解,标注JAXB在进行java对象与XML之间进行转换时只关注字段,而不关注属性。
接下来你要分别在服务端和客户端分别启用MTOM支持,Spring的配置文件如下所示:
<jaxws:properties> <entry key="mtom-enabled" value="true"> </jaxws:properties>
这段内容加到<jaxws:server...、<jaxws:endpoint...、<jaxws:client...之间即可,也就是作为他们的子元素存在。如果你想使用java code实现,你可以在服务端、客户端获取javax.xml.ws.soap.SoapBinding实例,然后调用它的setMTOMEnabled(true)方法。其实从这里你可以看出JAX-WS是天然支持MTOM的,只不过默认禁用了这一功能,因为在没有附件这种大量数据要传输,MTOM的优点并不会体现出来。
我们假设服务端SEI的实现的一个方法如下所示:
public Customer selectMaxLongNameStudent(Customer c1, Customer c2) { Customer rs=null; if(c1.getName().length()>c2.getName().length()) rs=c1; else rs=c2; rs.setImageData(new DataHandler(new FileDataSource(new File("d:"+File.separator+"18.jpg")))); return rs; }
我们看到DataHandler需要DataSource进行构造,这里我们用到了javax.activation.DataSource的一个文件实现类来实现。
客户端调用代码如下所示:
...... String attachmentMimeType = helloServiceImpl.selectMaxLongNameStudent(c1, c2).getImageData().getDataSource().getContentType(); System.out.println(attachmentMimeType);
你可以看到控制台输出image/jpeg,MTOM传输附件成功。如果你使用了日志拦截器,你会看到服务端的控制台打印出了很多乱码,这些乱码就是传输附件。
如果我们禁用MTOM,还要传递附件,此时,附件会被编为BASE64码进行传递,这种方式传递附件的缺点很明显,一个10KB的图片的BASE64码在WORD里都可以用4篇来显示,那么大一些的附件将会使得XML的体积迅速膨胀,这与MTOM的原样传输二进制数据是没有可比性的。
相关推荐
NULL 博文链接:https://qsx1982-126-com.iteye.com/blog/643728
winform 使用MTOM源码! 很值得下载看看!资源免费,大家分享!!
NULL 博文链接:https://exceptioneye.iteye.com/blog/1325187
SOAP Web 服务的响应类型,使用 MTOM 来流式传输大量编码为协议缓冲区的记录。 客户端在服务器仍在发送时处理记录。 无需将整个结果集保存在服务器或客户端的主内存中,因为响应类型消耗来自迭代器的缓冲区并将...
一个基于gsoap的mtom attachment 开发实例
SOAP使用
VS 2008工程 http://www.codeproject.com/KB/XML/MTOMWebServices.aspx
VS 2005工程 http://www.codeproject.com/KB/XML/MTOMWebServices.aspx
使用Java 8,Spring,JAXB的SOAP MTOM / XOP模板 上载和下载文件非常麻烦。 都是为了创建伪造HTML表单并通过JavaScript伪造单击它们而只是为了将特定类型的文件发送到特定类型的REST端点而进行的黑客尝试。 我在...
NULL 博文链接:https://zjumty.iteye.com/blog/1892397
上载一个简单的REST实用程序,用于将文件上传到托管文件传输服务器或其他基于文件的集成服务器,SaaS或PaaS云应用程序。... 该实用程序可与Oracle Managed File Transfer服务器配合... 使用MTOM附件上传到HTTP服务器先决
包括简单的HelloWorld、复杂对象传递、安全机制、大文件上传(MTOM)、嵌入jetty等。 呵呵,3分不多吧=,=!!
这个教程将了如何使用CXF开发WebService,包括JAX-WS、JAX-RS规范、数字证书、MTOM附件传输、异步调用、异常处理、使用Axis+Spring解决RPC/Encode的问题向旧规范JAX-RPC的兼容,第三版版教程在最一开始分别介绍了...
傳輸大檔案 Sending Files in Chunks with MTOM Web Services and .NET 2.0
本文根据我自己的实践,将axis2与was7的集成进行了详细解说,主要包括: 1. 将原生axis2.war部署到was7上; 2. 将axis2集成到web工程中;...示例比较简单,但我自己实践了mtom附件传输的服务实现,所以可供参考。
wsdl解析,soap消息格式 输入输出参数的注解,Web服务上下文 Jax—Ws异常处理,MTOM文件传输 Jax-Rs,Web服务生命周期 Cxf集成Spring 安全机制(用户命令+数字签名+混合验证) Cxf拦截器特征机制,Jax-Rs异步调用
DICOM国际会议暨研讨会:WADO及更...对于图像传输所需的网络服务的一些技术细节,将会提供详细介绍(例如MTOM)。朝着网络服务的进化将可能会更好地满足“环WADO”所需的环境,例如安全问题或医疗图像的引用的便携性。
一个apache-cxf+spring的MTOM的例子
wsimport -keep http://xxxx:8080/axis2test/services/HelloWorld?wsdl工具所在目录生成本地代码,通过本地java代码访问wsdl接口
支持提供 WSDL HTTP URL 以及本地 WSDL 文件不支持设置 SOAP 标头SOAP 1.2 和 HTTP 端口绑定WS-安全WS-寻址MTOM 二进制附件UDDI注意事项请记住,生成的代码只是 WSDL 是什么样子的反映。 如果您的 WSDL 具有重复的...