XSL:FO转PDF中介器报“no object DCH for MIME type application/pdf”错误如何解决
XSL:FO转PDF中介器报错解决方案
错误根因
本次报错由两个核心问题触发:
- 代理服务中中介器执行后的日志配置尝试序列化完整二进制PDF payload,
LogMediator在将二进制内容转为字符串过程中触发DataHandler读取异常 - 中介器中
DataHandler构造逻辑错误,ByteArrayOutputStream无法直接作为DataHandler的数据源,JAF框架找不到对应application/pdf类型的内容处理器
具体修复步骤
1. 修改代理服务配置
删除中介器后输出完整payload的日志节点,避免触发二进制内容序列化:
<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="PDFTest" startOnLoad="true" statistics="disable" trace="disable" transports="http,https"> <target> <inSequence> <log level="custom"> <property expression="/" name="input"/> </log> <class name="com.example.PDFMediator"/> <!-- 替换原有的输出完整output的日志节点 --> <log level="custom"> <property name="status" value="PDF转换完成"/> </log> <send/> </inSequence> </target> <description/> </proxy>
2. 调整中介器核心逻辑
修改DataHandler构造方式、清空原有SOAP Body内容、关闭不需要的MTOM配置,核心修改点如下:
// 转换完成后原有逻辑修改 trace.info("PDF转换完成,大小:" + out.size() + "字节"); // 1. 清空SOAP Body原有内容 body.removeChildren(); // 2. 正确构造DataHandler,使用ByteArrayDataSource封装二进制内容 ByteArrayDataSource dataSource = new ByteArrayDataSource(out.toByteArray(), MimeConstants.MIME_PDF); DataHandler dataHandler = new DataHandler(dataSource); OMFactory fac = OMAbstractFactory.getOMFactory(); OMText textData = fac.createOMText(dataHandler, true); body.addChild(textData); // 3. 删除原有的ENABLE_MTOM配置,新增关闭SOAP信封配置 // 删除context.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); 这行 context.setProperty(org.apache.axis2.Constants.Configuration.DISABLE_SOAP, Boolean.TRUE); context.setProperty(Constants.Configuration.MESSAGE_TYPE, MimeConstants.MIME_PDF); context.setProperty(Constants.Configuration.CONTENT_TYPE, MimeConstants.MIME_PDF); context.setProperty(org.apache.axis2.Constants.Configuration.CONTENT_TYPE, MimeConstants.MIME_PDF);
3. 依赖校验
确认环境中已引入javax.mail相关依赖,保证ByteArrayDataSource类可用,如未引入可添加对应依赖包到WSO2的/repository/components/lib目录下。
内容的提问来源于stack exchange,提问作者René de Vries
相关产品推荐
相关产品推荐

