mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
Replace XMLReaderFactory with SAXParserFactory
XMLReaderFactory has been marked as deprecated and without additional configuration, and it's slower than SAXParserFactory. Previously `XMLReaderFactory.createXMLReader()` is called upon every request. This is an anti-pattern as mentioned in [1] and it can be very slow since it loads the jar service file unless a parser has been pre-assigned [2] (e.g. by setting org.xml.sax.driver). SAXParserFactory uses a FactoryFinder [3] instead, which takes advantage of a thread-local cache provided by ServiceLoader. Developers can still pre-assign a factory by setting javax.xml.parsers.SAXParserFactory to make it faster. [1] https://bugs.openjdk.java.net/browse/JDK-6925410 [2] https://github.com/openjdk/jdk/blob/c8add223a10030e40ccef42e081fd0d8f00e0593/src/java.xml/share/classes/org/xml/sax/helpers/XMLReaderFactory.java#L144-L148 [3] https://github.com/openjdk/jdk/blob/66c653c561b3b5e904579af62e23ff94952bca05/src/java.xml/share/classes/javax/xml/parsers/SAXParserFactory.java#L181-L185 See gh-27239
This commit is contained in:
committed by
Stephane Nicoll
parent
32359c52b4
commit
baed0785fd
+6
-2
@@ -21,6 +21,8 @@ import java.io.StringWriter;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.dom.DOMResult;
|
||||
@@ -63,9 +65,11 @@ abstract class AbstractStaxHandlerTests {
|
||||
|
||||
|
||||
@BeforeEach
|
||||
@SuppressWarnings("deprecation") // on JDK 9
|
||||
void createXMLReader() throws Exception {
|
||||
xmlReader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
|
||||
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
|
||||
saxParserFactory.setNamespaceAware(true);
|
||||
SAXParser saxParser = saxParserFactory.newSAXParser();
|
||||
xmlReader = saxParser.getXMLReader();
|
||||
xmlReader.setEntityResolver((publicId, systemId) -> new InputSource(new StringReader("")));
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -19,6 +19,8 @@ package org.springframework.util.xml;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.transform.Transformer;
|
||||
@@ -64,10 +66,12 @@ abstract class AbstractStaxXMLReaderTests {
|
||||
|
||||
|
||||
@BeforeEach
|
||||
@SuppressWarnings("deprecation") // on JDK 9
|
||||
void setUp() throws Exception {
|
||||
inputFactory = XMLInputFactory.newInstance();
|
||||
standardReader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
|
||||
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
|
||||
saxParserFactory.setNamespaceAware(true);
|
||||
SAXParser saxParser = saxParserFactory.newSAXParser();
|
||||
standardReader = saxParser.getXMLReader();
|
||||
standardContentHandler = mockContentHandler();
|
||||
standardReader.setContentHandler(standardContentHandler);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import java.io.StringReader;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -62,13 +64,15 @@ class DomContentHandlerTests {
|
||||
|
||||
|
||||
@BeforeEach
|
||||
@SuppressWarnings("deprecation") // on JDK 9
|
||||
void setUp() throws Exception {
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
documentBuilderFactory.setNamespaceAware(true);
|
||||
documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
result = documentBuilder.newDocument();
|
||||
xmlReader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
|
||||
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
|
||||
saxParserFactory.setNamespaceAware(true);
|
||||
SAXParser saxParser = saxParserFactory.newSAXParser();
|
||||
xmlReader = saxParser.getXMLReader();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user