Spring 6与Java 17中TransformerFactory属性从javax到Jakarta的迁移
Java 17 + Spring 6 下 TransformerFactory 系统属性的必要性与Jakarta迁移指南
一、这个系统属性还需要保留吗?
先搞清楚Java 17里的默认行为:Java 11及更早版本中,com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl是默认的XSLTC实现,但Java 17开始,不管是Oracle JDK还是OpenJDK,默认的TransformerFactory实现已经做了调整。
要不要留这个属性,得看你的应用情况:
- 要是你已经完成SOAP接口迁移,且测试下来没出现XSLT相关的错误(比如XML转换异常、结果不符合预期),可以先注释掉这个属性,跑一遍全量测试。如果一切正常,直接删掉就行。
- 要是删掉后出现TransformerFactory加载失败、XSLT处理结果不对,说明你的应用确实依赖这个特定实现,那就得保留,但要跟着Jakarta规范改命名空间。
二、迁移到Jakarta规范的具体操作
Java EE转Jakarta EE后,所有javax.*的命名空间都换成了jakarta.*,对应的系统属性和实现类也要跟着改:
- 替换系统属性名:把原来的
javax.xml.transform.TransformerFactory改成jakarta.xml.transform.TransformerFactory - 选对实现类:
- 不推荐继续用JDK内部的
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,因为Java 17开始内部API被限制,未来版本可能直接移除。更稳妥的是引入Apache官方的Jakarta兼容版Xalan依赖:
用Maven的话,加这个依赖:
对应的实现类是<dependency> <groupId>org.apache.xalan</groupId> <artifactId>xalan-jakarta</artifactId> <version>2.7.3</version> </dependency>org.apache.xalan.xsltc.trax.TransformerFactoryImpl - 要是你非要用JDK内部的实现(不建议),得给JVM加参数
--add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED,不然会抛出非法访问异常。
- 不推荐继续用JDK内部的
- 修改代码:
用官方依赖的话,代码改成这样:
坚持用内部实现的话,代码是:System.setProperty("jakarta.xml.transform.TransformerFactory", "org.apache.xalan.xsltc.trax.TransformerFactoryImpl");System.setProperty("jakarta.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
三、额外要注意的点
- Spring 6完全基于Jakarta EE,所以你得确保应用里所有XML相关的代码都从
javax.xml迁移到了jakarta.xml,别留遗漏。 - 测试的时候重点盯SOAP接口里的XSLT转换逻辑,比如请求/响应的XML解析、样式表处理这些环节,确保迁移后功能和之前一致。
内容的提问来源于stack exchange,提问作者Nisarg Bhagavantanavar
相关产品推荐
相关产品推荐

