我一直在努力让这个测试工作一段时间,相关代码在生产中执行良好,我的假设是它有一些额外的配置,大量搜索似乎与电子邮件处理和附加库专门相关,我不知道不想包含其他任何内容,将 DataHandler 链接到处理“文本/纯文本”的相关方式时我缺少什么?
预期结果:DataHandler 允许我将输入“值”流式传输回结果。
使用此代码重现问题:
import java.io.IOException;
import java.io.InputStream;
import javax.activation.CommandInfo;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DataHandlerTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void test() throws IOException {
printDefaultCommandMap();
DataHandler dh = new DataHandler("Value", "text/plain");
System.out.println("DataHandler commands:");
printDataHandlerCommands(dh);
dh.setCommandMap(CommandMap.getDefaultCommandMap());
System.out.println("DataHandler commands:");
printDataHandlerCommands(dh);
final InputStream in = dh.getInputStream();
String result = new String(IOUtils.toByteArray(in));
System.out.println("Returned String: " + result);
}
private void printDataHandlerCommands(DataHandler dh) {
CommandInfo[] infos = dh.getAllCommands();
printCommands(infos);
}
private void printDefaultCommandMap() {
CommandMap currentMap = CommandMap.getDefaultCommandMap();
String[] mimeTypes = currentMap.getMimeTypes();
System.out.println("Found " + mimeTypes.length + " MIME types.");
for (String mimeType : mimeTypes) {
System.out.println("Commands for: " + mimeType);
printCommands(currentMap.getAllCommands(mimeType));
}
}
private void printCommands(CommandInfo[] infos) {
for (CommandInfo info : infos) {
System.out.println(" Command Class: " +info.getCommandClass());
System.out.println(" Command Name: " + info.getCommandName());
}
}
}
异常(exception):
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type text/plain at javax.activation.DataHandler.getInputStream(DataHandler.java:249)
非常感谢您的帮助,我希望这是一个格式正确的问题!
==========================
2 月 25 日更新
我发现如果我知道我在 DataHandler 中存储了一个 String,那么我可以将结果转换为 String 并返回存储的对象,例如:
@Test
public void testGetWithoutStream() throws IOException {
String inputString = "Value";
DataHandler dh = new DataHandler(inputString, "text/plain");
String rawResult = (String) dh.getContent();
assertEquals(inputString, rawResult);
}
但是被测试的代码使用了InputStream,所以我的“真实”测试在本地执行时仍然失败。 继续我的调查,并仍然希望有人在这方面提供帮助/指导......
最佳答案
回答我自己的问题,供任何人将来引用。
所有功劳归于:https://community.oracle.com/thread/1675030?start=0
这里的原则是,您需要为 DataHandler 提供一个包含 DataContentHandler 的工厂,该工厂将按照您希望的 MIME 类型行事,通过静态方法进行设置,该方法似乎会影响所有 DataHandler 实例。
我声明了一个新类 (SystemDataHandlerConfigurator),它有一个公共(public)方法来创建我的工厂并为其提供静态 DataHandler.setDataContentHandlerFactory() 函数。
如果我在运行之前执行此操作,我的测试现在可以正常工作:
SystemDataHandlerConfigurator configurator = new SystemDataHandlerConfigurator();
configurator.setupCustomDataContentHandlers();
系统数据处理程序配置器
import java.io.IOException;
import javax.activation.*;
public class SystemDataHandlerConfigurator {
public void setupCustomDataContentHandlers() {
DataHandler.setDataContentHandlerFactory(new CustomDCHFactory());
}
private class CustomDCHFactory implements DataContentHandlerFactory {
@Override
public DataContentHandler createDataContentHandler(String mimeType) {
return new BinaryDataHandler();
}
}
private 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 {
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 mimeType, java.io.OutputStream outputStream)
throws java.io.IOException {
if (mimeType == "text/plain") {
byte[] stringByte = (byte[]) ((String) obj).getBytes("UTF-8");
outputStream.write(stringByte);
}
else {
throw new IOException("Unsupported Data Type: " + mimeType);
}
}
}
}
关于java - 如何将 "text/plain"MIME 类型添加到 DataHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48962997/