org.apache.xml.utils.WrappedRuntimeException: The output format must have a '{http://xml.apache.org/xalan}content-handler' prope

本文记录了一个关于AjaxAnywhere在特定服务器环境下出现的异常问题及其排查过程。该问题表现为org.apache.xml.utils.WrappedRuntimeException异常,提示输出格式必须包含特定的内容处理器属性。通过对服务器环境的对比和逐步调试,最终定位到了可能的问题根源。

org.apache.xml.utils.WrappedRuntimeException: The output format must have a '{http://xml.apache.org/xalan}content-handler' property!
org.apache.xalan.serialize.SerializerFactory.getSerializer(SerializerFactory.java:142)
org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:232)
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:296)
org.ajaxanywhere.XMLHandler.sendDOMDocument(XMLHandler.java:109)
org.ajaxanywhere.XMLHandler.handleError(XMLHandler.java:150)
org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:67)
cn.sintal.common.filter.LogFilter.doFilter(LogFilter.java:168)
cn.sintal.common.filter.CookieFilter.doFilter(CookieFilter.java:90)
cn.sintal.common.filter.EncodingFilter.doFilter(EncodingFilter.java:50)

这是我发布到测试服务器后,执行AjaxAnywhere的时候出现的错误。我曾经找过一些帖子:
说吧xalan.jar删除或者升级到2.5以上的版本后这个问题就解决了。但是我的工程里没有此包。
所以应该不是同一个原因.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{http://xml.apache.org/xalan}content-handler  
org.apache.xml.utils.WrappedRuntimeException: The output format must have a '{http://xml.apache.org/xalan}content-handler' property! remove xalan.jar from web application ,restart it, OK!
 //我的工程里并没有这个jar,本地也没有错误。但是加上他之后就出现了此错误。
 //我得xalan_2.4.jar.
This bug has been fixed in Xalan Java 2.5.2.  Please verify.
//是的,我使用了xalan_2.5 ~xalan_2.7.jar都可以正常运行。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

我的问题看来是其他原因引起的。奇怪的是我把服务器上不好用的工程下载到本地后运行竟然
十分正常!!所以我怀疑是tomcat环境不同,于是我本地换成和服务器的tomcat一个版本,并把
服务器tomcat/common/lib , share/lib,service/lib下的公共包一并拷贝到本地tomcat。并逐一对比
了两个tomat环境直道确认完全相同。

但是仍旧是本地的ajaxanywhere一切正常,而服务器上的报如上的错误!!!!

可能还是有些不同,但就是是哪里呢?

(还好正式服务器上是好用的)有知道的朋友请告诉我:msn  shirongxin@hotmail.com

 

 

 

 

 

 

### 问题分析 `com.sun.org.apache.xml.internal.utils.WrappedRuntimeException` 是一个常见的运行时异常,通常与 XML 解析或 XSLT 转换相关的问题有关。根据提供的引用信息,该异常提示内容为: > The output format must have a '{http://xml.apache.org/xalan}content-handler' property! 这表明在执行 XSLT 转换过程中,系统期望找到特定的输出格式属性 `{http://xml.apache.org/xalan}content-handler`,但未能找到或配置不正确[^1]。 ### 可能原因及解决方案 #### 1. **依赖库冲突** 当项目中存在多个版本的 `xalan` 或 `xml-apis` 库时,可能会导致类加载冲突,从而引发此异常。例如,在新工程中复制代码后,如果未正确清理旧的依赖项(如 `xalan.jar`),就会出现此类问题[^2]。 **解决方法:** - 检查项目的构建路径,确保只包含一个版本的 `xalan.jar`。 - 删除服务器(如 Tomcat)部署目录中的重复依赖文件(如 `lib` 文件夹下的 `xalan.jar`)。 - 使用 Maven 或 Gradle 等构建工具管理依赖,并排除不必要的传递依赖。 #### 2. **XSLT 输出格式配置错误** 该异常也可能由于 XSLT 样式表中 `<xsl:output>` 元素配置不当引起。如果指定了非标准的输出方法(如 `method="html"` 或 `method="text"`),但未正确配置处理器,也可能触发异常。 **解决方法:** - 确保 `<xsl:output>` 中的方法是标准支持的类型,如 `xml`, `html`, `text`。 - 如果使用了自定义的 `ContentHandler`,需确保其正确实现并注册到 `TransformerFactory` 中。 - 示例配置: ```xml <xsl:output method="xml" encoding="UTF-8" indent="yes"/> ``` #### 3. **JVM 内置的 Xalan 实现与外部库冲突** Java 运行时环境(特别是 JDK 6 及以上)内置了 Apache Xalan 的副本(位于 `com.sun.org.apache.xml.internal.utils` 包下)。如果项目中引入了额外的 Xalan JAR 文件,可能会导致类加载器优先使用内置版本,而忽略外部版本,从而引发兼容性问题。 **解决方法:** - 避免将 `xalan.jar` 和 `xml-apis.jar` 添加到 JVM 的扩展路径(`ext` 目录)中。 - 使用 `-Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl` 启动参数切换至其他 XSLT 引擎(如 Saxon)以绕过默认实现。 #### 4. **Ant 构建文件配置问题** 在使用 Ant 执行构建任务时,若 `build.xml` 中涉及 XML 或 XSLT 处理任务(如 `<xslt>`),且配置不正确,也可能抛出类似异常。 **解决方法:** - 确保 Ant 的 `xslt` 任务配置正确,指定正确的样式表和输出格式。 - 示例配置: ```xml <xslt in="input.xml" out="output.html" style="transform.xsl"> <param name="cssfile" expression="style.css"/> </xslt> ``` - 若构建文件本身存在问题,建议重新编写或从已知正常工作的模板中复制。 ### 总结 该异常的核心问题是 XSLT 转换过程中对输出格式的处理失败。解决思路应围绕依赖管理、配置检查以及构建工具设置展开。通过排查依赖冲突、校正 XSLT 配置、调整 JVM 类加载策略等方式,可以有效避免此类异常的发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值