Перейти к основному содержимому

Не удалось найти Spring NamespaceHandler для пространства имен схемы XML

· 3 мин. чтения

1. Проблема

В этой статье будет рассмотрена одна из самых распространенных проблем конфигурации в Spring — не найден обработчик пространства имен для одного из пространств имен Spring . В большинстве случаев это означает, что в пути к классам отсутствует одна конкретная банка Spring, поэтому давайте рассмотрим, какими могут быть эти отсутствующие схемы и какая отсутствует зависимость для каждой из них.

2. http://www.springframework.org/schema/security

Недоступность пространства имен безопасности на сегодняшний день является наиболее часто встречающейся проблемой на практике:

<?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>

Что приводит к следующему исключению:

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]

Решение простое — в пути к классам проекта отсутствует зависимость spring-security-config :

<dependency> 
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>

Это поместит правильный обработчик пространства имен — в данном случае SecurityNamespaceHandler — в путь к классам и будет готов к анализу элементов в пространстве имен безопасности .

Полную конфигурацию Maven для полной настройки Spring Security можно найти в моем предыдущем руководстве по Maven .

3. http://www.springframework.org/schema/aop

Та же проблема возникает при использовании пространства имен aop без необходимой библиотеки aop spring в пути к классам:

<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>

Точное исключение:

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]

Решение аналогичное — нужно добавить банку spring-aop в путь к классам проекта:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>

В этом случае AopNamespaceHandler будет присутствовать в пути к классам после добавления новой зависимости.

4. http://www.springframework.org/schema/tx

Использование пространства имен транзакций — небольшого, но очень полезного пространства имен для настройки семантики транзакций:

<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>

также приведет к исключению, если правая банка не находится в пути к классам:

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]

Отсутствующая зависимость здесь — spring-tx :

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>

Теперь правильный NamspaceHandler , а именно TxNamespaceHandler , будет присутствовать в пути к классам, позволяя декларативное управление транзакциями как с XML, так и с аннотациями.

5. http://www.springframework.org/schema/mvc

Переходим к пространству имен mvc :

<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>

Отсутствующая зависимость приведет к следующему исключению:

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]

В этом случае отсутствует зависимость spring-mvc :

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>

Добавление этого в pom.xml добавит MvcNamespaceHandler в путь к классам, что позволит проекту настроить семантику MVC с использованием пространства имен.

6. Заключение

Наконец, если вы используете Eclipse для управления веб-сервером и развертывания, убедитесь, что раздел проекта Deployment Assembly правильно настроен , а именно, что зависимости Maven действительно включены в путь к классам во время развертывания.

В этом руководстве обсуждались обычные подозреваемые в проблеме «Невозможно найти Spring NamespaceHandler для пространства имен схемы XML» и предоставлялись решения для каждого случая.