diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java
index b0719aa07db..eb86869264e 100644
--- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java
+++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java
@@ -1417,4 +1417,14 @@ public class BeanDefinitionParserDelegate {
public boolean nodeNameEquals(Node node, String desiredName) {
return DomUtils.nodeNameEquals(node, desiredName);
}
+
+ /**
+ * Gets the local name for the supplied {@link Node}. The default implementation calls {@link Node#getLocalName}.
+ * Subclasses may override the default implementation to provide a different mechanism for getting the local name.
+ * @param node the Node
+ * @return the local name of the supplied Node.
+ */
+ public String getLocalName(Node node) {
+ return node.getLocalName();
+ }
}
diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerSupport.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerSupport.java
index ae1e28e3d17..ee996402b83 100644
--- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerSupport.java
+++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerSupport.java
@@ -77,10 +77,11 @@ public abstract class NamespaceHandlerSupport implements NamespaceHandler {
* the local name of the supplied {@link Element}.
*/
private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {
- BeanDefinitionParser parser = this.parsers.get(element.getLocalName());
+ String localName = parserContext.getDelegate().getLocalName(element);
+ BeanDefinitionParser parser = this.parsers.get(localName);
if (parser == null) {
parserContext.getReaderContext().fatal(
- "Cannot locate BeanDefinitionParser for element [" + element.getLocalName() + "]", element);
+ "Cannot locate BeanDefinitionParser for element [" + localName + "]", element);
}
return parser;
}
@@ -102,11 +103,12 @@ public abstract class NamespaceHandlerSupport implements NamespaceHandler {
*/
private BeanDefinitionDecorator findDecoratorForNode(Node node, ParserContext parserContext) {
BeanDefinitionDecorator decorator = null;
+ String localName = parserContext.getDelegate().getLocalName(node);
if (node instanceof Element) {
- decorator = this.decorators.get(node.getLocalName());
+ decorator = this.decorators.get(localName);
}
else if (node instanceof Attr) {
- decorator = this.attributeDecorators.get(node.getLocalName());
+ decorator = this.attributeDecorators.get(localName);
}
else {
parserContext.getReaderContext().fatal(
@@ -114,7 +116,7 @@ public abstract class NamespaceHandlerSupport implements NamespaceHandler {
}
if (decorator == null) {
parserContext.getReaderContext().fatal("Cannot locate BeanDefinitionDecorator for " +
- (node instanceof Element ? "element" : "attribute") + " [" + node.getLocalName() + "]", node);
+ (node instanceof Element ? "element" : "attribute") + " [" + localName + "]", node);
}
return decorator;
}