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

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

Вызывается: oracle.xml.parser.schema.XSDException: Дублированное определение для: 'identifType'

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

6 ответов

Вместо модификации xmlparserv2.jar можете добавить

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

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

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

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

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

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

Пока это вызывает ошибку:

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..) и заменить их эквивалентными определениями, используя обычные bean-компоненты. Например, вы можете заменить <tx:annotation-driven/> с <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>

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

  1. Согласованное управление версиями
    schema/beans/spring-beans**-3.1**.xsd schema/jee/spring-jee**-3.1**.xsd schema/mvc/spring-mvc**-3.1**.xsd
    и т.п.

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

Если в схемы есть импорт в один и тот же 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"/>
Другие вопросы по тегам