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的原样传输二进制数据是没有可比性的。
相关推荐
本文将深入探讨如何在CXF中使用MTOM方式处理附件。 【描述】: 虽然描述信息为空,但我们可以推测这篇博客可能详细介绍了如何在Apache CXF框架中启用MTOM来处理服务接口中的二进制附件。通常,这会涉及以下几个...
在这个"mtom-stream-test"项目中,"mtom-stream"可能是测试用例或实际的SOAP消息流,用于检验MTOM传输的正确性和性能。 MTOM技术的应用广泛,尤其是在需要高效传输大文件的场景中。例如,在医疗领域,传输影像诊断...
在"MTOM Chunked File Transfer9"这个压缩包中,可能包含了一个示例,演示如何使用MTOM分块传输大文件。分块传输是一种技术,将大文件分割成多个小块进行发送,以便更有效地管理网络带宽和内存资源。在MTOM上下文中...
在提供的压缩包文件"MTOM Chunked File Transfer8"中,可能包含了演示如何实现分块MTOM传输的代码示例或者测试数据。分析这个文件,可以更深入地理解MTOM在实际项目中的应用。 总之,MTOM Web Services 2005是.NET ...
MTOM 使用 XOP(XML-binary Optimized Packaging)将 SOAP 消息分成多个部分,以便更好地传输大型文件。 SOAP 在企业应用中有广泛的应用,如 Web 服务、消息队列、远程过程调用等。SOAP 的优点包括松耦合、平台独立...
在服务接口和实现类中使用 `@MTOM` 注解,同时在客户端和服务端配置 MTOM 启用: 服务端: ```java @MTOM public interface FileService { public void uploadFile(byte[] file); } ``` 客户端: ```java @MTOM...
【文件使用】"使用Axis2传输附件.txt" 该文本文件很可能包含了详细的代码示例,指导读者如何在实际项目中设置和使用Axis2的附件传输功能。它可能涵盖了服务端和客户端的代码实现,以及可能遇到的问题和解决策略。 ...
当发送包含大量二进制数据的SOAP消息时,MTOM会将二进制数据作为单独的附件发送,而不是将其完全编码到XML消息中。这大大减少了消息的大小,提高了传输效率。 在WCF中启用MTOM,你需要在服务合同接口和服务配置中...
在SOAP消息中,附件的处理是通过MTOM(Message Transmission Optimization Mechanism)或SwA(SOAP with Attachments)来实现的,这两种机制都是为了在SOAP消息中有效地传输二进制数据,如图片、文档等。 MTOM是一...
在MTOM中,BLOB和CLOB数据以引用形式出现在SOAP消息中,实际数据则作为单独的附件传输。 3. **XOP(XML-binary Optimized Packaging)** - **XOP包装**:MTOM依赖于XOP标准,它定义了一种将XML文档和二进制数据...
MTOM能够将大型数据块作为SOAP消息的附件发送,而不是将它们完全嵌入到XML消息体中,从而显著减少了网络带宽的消耗。 在Java中,`DataHandler`类是用于处理不同类型的二进制数据,如图像、文档等。它可以与输入/...
当使用MTOM时,二进制数据不再以XML格式编码,而是作为附件发送,从而大大减少了网络传输的数据量,提高了性能和效率。MTOM与W3C的XOP(XML-binary Optimized Packaging)规范相结合,允许在SOAP消息中引用外部二...
SwA使用MIME格式将附件与SOAP消息一起发送,使得客户端可以通过HTTP GET请求单独下载附件,而无需一次性接收整个SOAP消息。 3. **客户端实现**: 在客户端,首先需要构造一个SOAP请求,包含指向大文件的URL或者...
它提供了丰富的安全特性,包括基于消息的安全性(WS-Security)、高效的二进制数据传输(MTOM)、可选的宿主环境和自定义声明性策略管道(Policy)。WSE3.0的目标是补充WebService 2.0的功能,支持更多的WS-*协议,...
MTOM是W3C制定的一种技术,用于减少SOAP消息中的大型二进制附件(如图像或文档)的传输大小。通常,这些大型数据在SOAP消息中以Base64编码的形式传输,这会增加消息的体积。而MTOM允许将二进制数据以引用的方式插入...
上载一个简单的REST实用程序,用于将文件上传到托管文件传输服务器或其他基于文件的集成服务器,SaaS或PaaS云应用程序。... 该实用程序可与Oracle Managed File Transfer服务器配合... 使用MTOM附件上传到HTTP服务器先决
MTOM是一种优化XML附件内容传输的方式,它允许二进制大对象以二进制的形式在SOAP消息中传输,而不是将它们编码为XML,这样可以显著减小SOAP消息的大小。 通过添加自定义拦截器,我们可以在SOAP消息发送之前处理权限...
- **MTOM附件传输**:详解如何使用MTOM (Message Transmission Optimization Mechanism) 传输大型文件或其他非文本数据。 - **异步调用**:讨论如何实现异步Web服务调用以提高性能。 - **异常处理**:介绍最佳实践以...
当Web服务需要交换大文件或者高效率传输非文本数据时,MTOM会自动将大附件转换为二进制格式,从而降低网络传输开销。 在Web服务开发中,这两个库经常一起使用。"axis.jar"提供了Web服务的基础框架,而"axis-saaj-...
2. **MTOM(Message Transmission Optimization Mechanism)**:MTOM是一种优化SOAP消息传输的方法,特别是对于大体积的二进制数据如图片或文件。它通过引用外部的二进制数据而不是实际包含它们来减小消息大小,从而...