Oracle APEX使用外部Apache FOP打印服务器打印报告时触发Java异常
问题根因
从提供的错误栈可以定位到空指针异常触发逻辑:org.apache.xmlgraphics.image.loader.util.ImageUtil.decorateMarkSupported方法调用FilterInputStream.markSupported时,输入流对象为null,本质是Apache FOP处理报告中的外部图片资源(LOGO、图表等)时,无法正常拉取对应资源,具体触发原因通常有三类:
- ORDS 19.1及以上版本调整了APEX打印请求的资源传递逻辑:默认不再将报告引用的静态资源嵌入到发送给FOP的XML payload中,仅传递资源的相对路径,独立部署的FOP应用没有权限访问APEX/ORDS的受保护资源路径,拉取图片时返回空流。
- Weblogic类加载冲突:Weblogic自带的XML解析、图像处理相关类库和Apache FOP 2.6依赖的xmlgraphics-commons包版本不兼容,导致资源加载时输入流初始化失败。
- FOP应用配置错误:自定义FOP Servlet配置的资源解析基路径错误,未配置允许访问APEX服务的资源地址,跨应用拉取资源被Weblogic安全策略拦截。
解决方案
方案1:调整APEX打印配置强制嵌入资源
该方案不需要修改FOP部署配置,兼容性最高:
- 进入APEX应用「共享组件」-「报告打印」,修改外部打印服务器配置
- 勾选「将所有图像嵌入到打印请求中」选项,保存后重新测试即可。
方案2:修复FOP Web应用的Weblogic部署配置
如果需要保留资源外链模式,按以下步骤调整配置:
- 在FOP应用的
WEB-INF目录下新建weblogic.xml配置文件,添加以下内容强制优先加载FOP自带的依赖包:
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd"> <container-descriptor> <prefer-application-packages> <package-name>org.apache.xmlgraphics.*</package-name> <package-name>org.apache.fop.*</package-name> <package-name>com.sun.org.apache.xalan.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic.xml>
- 在FOP的
conf/fop.xconf配置文件中添加APEX服务的基地址作为资源解析根路径:
<fop version="1.0"> <base>http://你的APEX服务地址/ords/</base> <!-- 其余原有配置保持不变 --> </fop>
- 重新打包fop.war并在Weblogic中重新部署,重启服务后测试。
方案3:使用ORDS内置FOP支持
Oracle ORDS 21.x已经内置了Apache FOP的支持,不需要独立部署自定义FOP应用:
- 停止并卸载当前部署的fop.war
- 进入ORDS配置目录,修改
defaults.xml配置,开启打印功能:
<entry key="apex.print.enabled" value="true"/> <entry key="apex.print.server" value="internal"/>
- 重启ORDS服务,将APEX的打印服务器配置调整为使用ORDS内置打印服务即可。
内容的提问来源于stack exchange,提问作者kapiell
相关产品推荐
相关产品推荐

