Java使用DynamicJasper 5.3.2渲染动态报表出现XmlParser错误求助
问题根因
java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature错误明确为XML解析器依赖版本冲突导致。JDK 1.8内置的XML解析器实现已经包含setFeature方法,但你项目类路径中引入了更早版本的XML解析相关依赖(比如xercesImpl 2.8及以下、xml-apis 1.3及以下版本),类加载时优先加载了旧版本的实现类,旧版本未实现JDK新增的setFeature接口方法,因此触发抽象方法错误。
修复步骤
- 第一步:排查项目依赖树,定位冲突的XML相关依赖
如果你使用Maven,执行mvn dependency:tree;如果使用Gradle,执行gradle dependencies,搜索xercesImpl、xml-apis两个依赖,确认是否有低于以下要求的版本被引入:- xercesImpl 最低兼容版本为2.9.1
- xml-apis 最低兼容版本为1.4.01
- 第二步:排除冲突的旧版本依赖
找到引入旧版本XML依赖的上层依赖后,在对应依赖声明中排除旧的xercesImpl和xml-apis,以Maven为例写法如下:
排除后如果运行提示缺少XML相关类,主动引入高版本兼容依赖即可:<dependency> <groupId>ar.com.fdvs</groupId> <artifactId>DynamicJasper</artifactId> <version>5.3.2</version> <exclusions> <exclusion> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> </exclusion> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> </exclusions> </dependency><dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.2</version> </dependency> <dependency> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> <version>1.4.01</version> </dependency> - 第三步:可选强制指定XML解析器实现类
如果完成依赖调整后仍报错,可以在报表生成代码执行前,手动指定JDK内置的XML解析器工厂,避免加载第三方旧实现:// 放在报表逻辑最前面执行 System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
额外优化提示
你当前代码中传入的rowsDataList是空集合,不会触发本次的XML解析错误,但后续报表渲染会显示无数据,可先添加几条测试数据验证功能。
内容的提问来源于stack exchange,提问作者Anaïs Siewe
相关产品推荐
相关产品推荐

