升级框架后因项目中xalan.2.7.1 jar包与spring-xml.2.4.3 jar包在TransformerFactory的实现类存在冲突,报错:
不支持:http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttributer
冲突原因:spring-xml jar包中org.springframework.xml.transform.TransformerFactoryUtils类中
private static TransformerFactory defaultSettings(TransformerFactory factory){
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,'');
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET,'');
return factory;
}
该方法设置了XMLConstants.ACCESS_EXTERNAL_DTD,XMLConstants.ACCESS_EXTERNAL_STYLESHEET两个属性值,
在xalan jar包中因META-INF/services/javax.xml.transform.TransformerFactory文件指定了TransformerFactory的实现类org.apache.xalan.processor.TransformerFactoryImpl,但是该类中不支持XMLConstants.ACCESS_EXTERNAL_DTD,XMLConstants.ACCESS_EXTERNAL_STYLESHEET属性。
解决方法:
因项目是web项目,在项目classpath中META-INF/services/目录下添加文件,文件命名javax.xml.transform.TransformerFactory,文件内容:com.sun.org.apache.xalan.internal.xsltc.TransformerFactoryImpl使用该文件让TransformerFactory的实现类为文件中的实现。
注:若项目为maven多模块项目,应将该文件放在主模块的META-INF/services/中。如果放在子模块,执行mvn clean package 打包后子模块打成的jar包如果加载顺序在xalan之后,TransformerFactory的优先实现类会是xalan jar中设置的实现类。