【发布时间】:2015-08-30 12:36:48
【问题描述】:
如何为我的 SOAPMessage 创建 mime-attachment text/xml?
我有一个函数,它发送 XML 的二进制文件。但我不知道该怎么做。
【问题讨论】:
标签: java web-services soap mime
如何为我的 SOAPMessage 创建 mime-attachment text/xml?
我有一个函数,它发送 XML 的二进制文件。但我不知道该怎么做。
【问题讨论】:
标签: java web-services soap mime
在客户端使用DataHandler/DataSource将二进制数据推送到消息中。
在服务器端,你需要创建一个DataContentHandler实现并注册到激活框架中。
第 1 步 - 添加二进制附件
实现一个简单的 DataSource 来获取数据:
import javax.activation.*;
class BinaryDataSource implements DataSource {
InputStream _is;
public BinaryDataSource(InputStream is) {
_is = is;
}
public String getContentType() { return "application/binary"; }
public InputStream getInputStream() throws IOException { return _is; }
public String getName() { return "some file"; }
public OutputStream getOutputStream() throws IOException {
throw new IOException("Cannot write to this file");
}
}
现在使用此代码添加附件:
InputStream data = ...
SOAPMessage msg = ...
DataHandler dh = new DataHandler(new BinaryDataSource(data));
AttachmentPart attachment = msg.createAttachmentPart(dh);
msg.addAttachmentPart(attachment);
第 2 步 - 设置服务器端
[注意:这对我有用]
创建一个处理“应用程序/二进制”类型的传入附件的 DataContentHandler。
import javax.activation.*;
import java.io.*;
public class BinaryDataHandler implements DataContentHandler {
/** Creates a new instance of BinaryDataHandler */
public BinaryDataHandler() {
}
/** This is the key, it just returns the data uninterpreted. */
public Object getContent(javax.activation.DataSource dataSource) throws java.io.IOException {
System.out.println("BinaryDataHandler: getContent called with: " + dataSource);
return dataSource.getInputStream();
}
public Object getTransferData(java.awt.datatransfer.DataFlavor dataFlavor,
javax.activation.DataSource dataSource)
throws java.awt.datatransfer.UnsupportedFlavorException,
java.io.IOException {
return null;
}
public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {
return new java.awt.datatransfer.DataFlavor[0];
}
public void writeTo(Object obj, String str, java.io.OutputStream outputStream)
throws java.io.IOException {
// You would need to implement this to have
// the conversion done automatically based on
// mime type on the client side.
}
}
现在,您可以使用此代码获取附件的数据:
SOAPMessage msg = ... //received message
Iterator ats = msg.getAttachments();
if( ats.hasNext() ){
AttachmentPart attachment = (AttachmentPart)ats.next();
InputStream contents = (InputStream)attachment.getContent();
}
最后,您需要注册您的 DataContentHandler 以便激活框架使用它。有几种方法(请参阅激活框架 javadocs 中的 MailcapCommandMap)。我所做的是在我的“java”解释器使用的 lib 目录中创建一个名为“mailcap”的文件。
这个文件看起来像这样:
应用程序/二进制文件;二进制数据处理程序 应用程序/二进制文件;; x-java-content-handler=BinaryDataHandler
这告诉激活框架将您的处理程序用于指定的 MIME 类型。
【讨论】:
Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml; start="<TEST>" --MIME_boundary Content-Type: text/xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID:<TEST> 最后:--MIME_boundary Content-Type: application/zip Content-Transfer-Encoding: binary Content-ID: <package1> <!-- attach --> --MIME_boundary 我该怎么做?