Дублированное определение для: '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 моего ответа здесь объясняет, почему это происходит, и несколько подходов к его устранению.
Согласованное управление версиями
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
Если в схемы есть импорт в один и тот же 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"/>