Дублированное определение для: 'identType'

У меня есть веб-приложение, в котором я использую spring 3.0 и связанный с oracle XMLTYPE jar com.oracle.xdb, который, в свою очередь, зависит от com.oracle.xml.xmlparserv2, я уверен, что большинство из вас знают об исключении, которое вы get, когда эти банки используются с spring 3.0, как показано ниже,

Причиняется: oracle.xml.parser.schema.XSDException: Дублированное определение для: 'identType'

есть несколько предложений по использованию другого парсера, такого как xerces, но в нашем случае, поскольку мы используем зависимость xdb, похоже, что мы не можем его изменить, чтобы использовать другой парсер, отличный от com.oracle.xml.xmlparserv2, он работал fine with spring 2.5.6 есть ли информация о том, когда это будет исправлено либо с помощью spring/oracle?

Ответ 1

Вместо изменения xmlparserv2.jar вы можете добавить

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

Нажмите здесь, чтобы прочитать сообщение на форумах Oracle, где обсуждаются проблемы.

Ответ 2

Я выяснил, что проблема связана с возможностью использования xmlparserv2 для надлежащего анализа атрибута xsi:schemaLocation.

Я проверил, что это работает:

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"

Пока это вызывает eror:

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"

Обходной путь заключается в том, чтобы удалить использование конкретных пространств имен (например, tx, util..) и заменить их эквивалентными определениями, используя общий beans. Например, вы можете заменить <tx:annotation-driven/> на <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>

Ответ 3

Удалить/META-INF/services каталог из xmlparserv2.jar - это содержимое регистрирует парсер Oracle.

Ответ 4

Шаг 4 мой ответ здесь объясняет, почему это происходит, и несколько подходов к его исправлению.

Ответ 5

  • Согласование версий
    schema/beans/spring-beans**-3.1**.xsd schema/jee/spring-jee**-3.1**.xsd schema/mvc/spring-mvc**-3.1**.xsd
    и т.д.

  • Порядок важен. spring -jee-3.1.xsd до spring - beans -3.1.xsd вызывает ошибку, поскольку в файле spring -jee-3.1.xsd у нас есть ссылка на импорт spring - beans -3.1.xsd

Ответ 6

Если две схемы имеют импорт в один и тот же XSD, следует также импортировать этот XSD, чтобы предотвратить ошибку "дублированного определения".

Например: У меня есть три схемы:

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/jee/spring-jee-4.2.xsd

Теперь я получаю ошибку, потому что у spring-util и spring-jee есть импорт в:

<xsd:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"/>
<xsd:import namespace="http://www.springframework.org/schema/tool" schemaLocation="http://www.springframework.org/schema/tool/spring-tool-4.2.xsd"/>

Когда пружинный инструмент будет импортирован вручную ДО spring-util и spring-jee:

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/tool/spring-tool-4.2.xsd
http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/jee/spring-jee-4.2.xsd

конфигурация XML будет правильно проанализирована.

Очевидно, у вас должны быть согласованные версии.

Небольшой обходной путь - определить некоторую часть конфигурации в других файлах с описанными различными схемами и импортировать ее, используя:

<import resource="part_of_config.xml"/>