使用Saxon HE解析XSLT时遭遇org.apache.xerces.jaxp.SAXParserFactoryImpl找不到的异常问题
你遇到的这个错误是典型的依赖缺失导致的——你代码里指定了要用org.apache.xerces.jaxp.SAXParserFactoryImpl作为SAX解析工厂,但你的Maven项目里并没有引入Xerces的相关依赖,所以JVM找不到这个类。
先梳理下你的场景:已经添加了Saxon-HE 10.6的Maven依赖,通过saxonTransform方法传入XML和XSL字符串进行转换,但在执行Transformer transformer = tFactory.newTransformer(xslSource);时抛出了:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found]
下面给你两种可行的解决方案:
方案1:添加Xerces依赖到Maven
既然你明确指定了要使用Xerces的SAX解析器,直接在pom.xml里补充Xerces的依赖即可:
<!-- 添加Xerces解析器依赖 --> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.2</version> </dependency>
添加后重新构建项目,依赖会自动下载,JVM就能找到对应的工厂类了。
方案2:移除SAXParserFactory的系统属性设置(更推荐)
其实Saxon本身自带了兼容的SAX解析器,你完全不需要强制指定Xerces的实现。可以把这行代码删掉:
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
这样TransformerFactory会自动使用Saxon默认的解析器,既避免了依赖缺失的问题,也简化了代码配置。
额外优化小建议
关于Saxon的属性配置,推荐直接通过TransformerFactory的setAttribute方法来设置,你已经在设置DTD_VALIDATION的部分是没问题的。如果需要更精细的控制,还可以补充其他特性,比如:
tFactory.setAttribute(FeatureKeys.SCHEMA_VALIDATION, false);
内容的提问来源于stack exchange,提问作者shashi sharma

