设置TransformerFactory特性时遇TransformerConfigurationException错误求助
解决TransformerFactory设置
disallow-doctype-decl特性失败的问题 我之前也碰到过一模一样的报错,其实问题的核心很清晰:你尝试设置的http://apache.org/xml/features/disallow-doctype-decl是XML解析器(比如Xerces)的特性,用来禁止DOCTYPE声明以防范XXE攻击,但你直接调用了TransformerFactory的setFeature()方法——而Xalan的TransformerFactoryImpl根本不支持这个特性,所以才会抛出TransformerConfigurationException。
下面给你两种可行的解决思路:
方法一:通过关联配置好的SAXParserFactory实现特性
这种方法是把配置了目标特性的SAXParserFactory绑定到TransformerFactory,让Transformer在解析XML时使用这个已配置的解析器:
import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.TransformerFactory; public class TransformerSetup { public static TransformerFactory mytFactory; public static void initTransformerFactory() throws Exception { // 1. 创建SAXParserFactory并设置disallow-doctype-decl特性 SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); saxFactory.setNamespaceAware(true); // 通常建议开启命名空间支持 // 2. 创建TransformerFactory并关联SAXParserFactory mytFactory = TransformerFactory.newInstance(); mytFactory.setAttribute( "http://javax.xml.XMLConstants/property/SAXParserFactory", saxFactory ); } }
方法二:直接配置XMLReader并绑定到TransformerFactory
如果你更倾向于直接操作XMLReader,也可以用这种方式:
import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import javax.xml.transform.TransformerFactory; public class TransformerSetup { public static TransformerFactory mytFactory; public static void initTransformerFactory() throws Exception { // 1. 创建XMLReader并设置目标特性 XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 2. 将配置好的XMLReader绑定到TransformerFactory mytFactory = TransformerFactory.newInstance(); mytFactory.setAttribute( "http://javax.xml.transform.sax.SAXSource/XMLReader", xmlReader ); } }
额外提示
- 确保你的项目中引入了支持该特性的XML解析器(比如Apache Xerces),如果用的是JDK自带的解析器,部分版本也支持这个特性,但建议明确依赖以避免版本兼容问题。
- 不要混淆XSLT TransformerFactory的特性和XML解析器的特性:前者负责XSLT转换相关的配置,后者才是处理XML解析层面的安全特性。
内容的提问来源于stack exchange,提问作者Manjunath H M
相关产品推荐
相关产品推荐

