Spring NamespaceHandler Example
This article will discuss one of the most common configuration problems in the spring framework i.e. ‘A namespace handler for one of the spring namespaces is not found’. Most of the times, this means that one particular spring jar is missing from the classpath. So, let’s go over what these missing schemas might be, and what the missing dependency is for each one.
1. Introduction
1.1 Spring Framework
- Spring is an open-source framework created to address the complexity of an enterprise application development
- One of the chief advantages of the Spring framework is its layered architecture, which allows developers to be selective about which of its components they can use while providing a cohesive framework for
J2EE
application development - Spring framework provides support and integration to various technologies for e.g.:
- Support for Transaction Management
- Support for interaction with the different databases
- Integration with the Object Relationship frameworks for e.g. Hibernate, iBatis etc
- Support for Dependency Injection which means all the required dependencies will be resolved with the help of containers
- Support for
REST
style webservices
1.2 Spring Namespaces
Spring Namespaces provides a good way to simplify the XML
files used to describe the bean definitions of a Spring Application Context. It is fairly an old concept introduced with Spring 2.0 but deserves being reviewed once in a while.
Now let’s take a look and understand the most common configuration problems of this framework.
1.2.1 Security Namespace Handler
The security namespace not being available is by far the most widely encountered problem in practice.
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> </beans:beans>
Which leads to the following exception:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/security] Offending resource: class path resource [securityConfig.xml]
The solution of this exception is straight-forward i.e. the spring-security-config
dependency is missing from the classpath of the project. Add the below dependency to the project’s pom.xml
:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.2.5.RELEASE</version> </dependency>
This will put the correct namespace handler (i.e. in this case SecurityNamespaceHandler
) in the classpath and ready to parse the elements in the security namespace.
Complete project tutorial for the Maven configuration can be found at this link.
1.2.2 AOP Namespace Handler
The same problem occurs when using the AOP namespace without having the necessary AOP (Aspect Object Programming) spring library in the classpath.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd"> </beans>
The exact exception that occurs is:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop] Offending resource: ServletContext resource [/WEB-INF/webConfig.xml]
The solution to this exception is to add the spring-aop
to the classpath of the project. Add the below dependency to the project’s pom.xml
:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.1.0.RELEASE</version> </dependency>
In this case, the AopNamespaceHandler
will be present in the project’s classpath after adding the new dependency and will resolve the exception.
1.2.3 Transaction Namespace Handler
Using the Transaction Namespace – a small but very useful namespace for the configuration of the transactional semantics.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> </beans>
The above bean definition will result in an exception if the right jar is not presented in the project’s classpath:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx] Offending resource: class path resource [daoConfig.xml]
The missing dependency here is spring-tx
. Add the below dependency to the project’s pom.xml
:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.1.0.RELEASE</version> </dependency>
Now, the correct namespace handler – namely TxNamespaceHandler
will be presented in the project’s classpath allowing the declarative transaction management with both XML
and annotations.
1.2.4 MVC Namespace Handler
Moving forward to the Spring’s MVC (i.e. Model, View, and Controller) namespace.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> </beans>
The missing dependency will lead to the below exception.
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/mvc] Offending resource: class path resource [webConfig.xml]
In this case, the missing dependency is: spring-mvc
. Add the below dependency to the project’s pom.xml
:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.0.RELEASE</version> </dependency>
Adding the spring-mvc
dependency to the pom.xml
will add the MvcNamespaceHandler
to the project’s classpath and it will allow the project to configure the MVC semantics using the namespace.
That’s all for this post. Happy Learning!!
2. Conclusion
In this tutorial we discussed the usual suspects for the ‘Unable to locate Spring NamespaceHandler for XML
schema namespace’ problem and we provided solutions for each occurrence. That’s all for this tutorial and I hope this article served you whatever you were looking for.