Java:Spring: конфликт XML при чтении spring context.xml Дублированное определение для: 'identifType'
Любой совет или помощь высоко ценится.
Есть много ссылок, но нет четкого решения. Интересно, как проекты Spring взаимодействуют с процедурами PLSQL, которые возвращают вывод XMLType. вам понадобится XMLParser, и тогда мы все получим эту ошибку при использовании с Spring. У кого-нибудь есть рекомендации?
У меня есть приложение Maven spring (mvc/Rest), которое работает хорошо, и я добавил ниже зависимости для взаимодействия с процедурами PLSQL,
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>xdb6</artifactId>
<version>11.2.0.4</version>
</dependency>
<dependency>
<groupId>com.xmlparserv2</groupId>
<artifactId>xmlparserv2</artifactId>
<version>11.1.1</version>
</dependency>
После включения xdb6
а также xmlparserv2
, Я получаю ошибку ниже при запуске приложения Spring (во время работы сервера)
2014-08-19 18: 28: 51 898 INFO | главная | osbeans.factory.xml.XmlBeanDefinitionReader
Loading XML bean definitions from class path resource [META-INF/spring/myapp-context.xml]
<Line 43, Column 57>: XML-24509: (Error) Duplicated definition for: 'identifiedType'
<Line 60, Column 28>: XML-24509: (Error) Duplicated definition for: 'beans'
<Line 140, Column 34>: XML-24509: (Error) Duplicated definition for: 'description'
<Line 152, Column 29>: XML-24509: (Error) Duplicated definition for: 'import'
<Line 174, Column 28>: XML-24509: (Error) Duplicated definition for: 'alias'
<Line 203, Column 33>: XML-24509: (Error) Duplicated definition for: 'beanElements'
<Line 218, Column 44>: XML-24509: (Error) Duplicated definition for: 'beanAttributes'
<Line 462, Column 43>: XML-24509: (Error) Duplicated definition for: 'meta'
<Line 470, Column 35>: XML-24509: (Error) Duplicated definition for: 'metaType'
<Line 487, Column 27>: XML-24509: (Error) Duplicated definition for: 'bean'
<Line 507, Column 38>: XML-24509: (Error) Duplicated definition for: 'constructor-arg'
.....
2014-08-19 18:28:52,014 ERROR | main | org.springframework.web.servlet.DispatcherServlet | Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 16 in XML document from class path resource [META-INF/spring/myapp-context.xml] is invalid; nested exception is oracle.xml.parser.schema.XSDException: Duplicated definition for: 'identifiedType'
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396) ~[spring-beans-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) ~[spring-beans-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) ~[spring-beans-3.2.0.RELEASE.jar:3.2.0.RELEASE]
Строка 16 в документе XML из ресурса пути к классу [META-INF/spring/myapp-context.xml] недействительна;
MyApp-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
Line 16 is http://www.springframework.org/schema/cache/spring-cache.xsd">
Предположим, что я удаляю Line 16 и его ссылки, тогда та же самая ошибка появляется в другой строке, скажем, в Line 13
Больше трассировки стека ошибок:
Caused by: org.xml.sax.SAXParseException: <Line 13, Column 70>: XML-24500: (Error) Can not build schema 'http://www.springframework.org/schema/tx' located at 'http://www.springframework.org/schema/tx/spring-tx.xsd'
at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:425) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.v2.XMLError.flushErrors1(XMLError.java:287) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:343) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:226) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.jaxp.JXDocumentBuilder.parse(JXDocumentBuilder.java:155) ~[xmlparserv2-11.1.1.jar:na]
Caused by: oracle.xml.parser.schema.XSDException: Duplicated definition for: 'identifiedType'
at oracle.xml.parser.schema.XSDBuilder.buildSchema(XSDBuilder.java:794) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.schema.XSDBuilder.build(XSDBuilder.java:489) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.schema.XSDValidator.processSchemaLocation(XSDValidator.java:999) ~[xmlparserv2-11.1.1.jar:na]
at oracle.xml.parser.schema.XSDValidator.startElement(XSDValidator.java:604) ~[xmlparserv2-11.1.1.jar:na]
Обновление 1
Основываясь на опубликованном ответе, он говорит, что доступно быстрое решение,
Чтобы переопределить изменения, сделанные xmlparserv2.jar, добавьте следующие свойства JVM в аргументы запуска сервера приложений. Логика java.xml.parsers.FactoryFinder будет сначала проверять переменные среды.
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
Это не рекомендуется, как четко указано в ссылке https://community.oracle.com/thread/1080787
Здесь упоминается другое решение (связанное с hibernate, но похожее): использование столбца Oracle XMLType в hibernate
В проекте maven spring переопределите параметры xmlparserv2.jar, создав следующие файлы в каталоге%PROJECT_HOME%/src/main/resources:
%PROJECT_HOME%/src/main/resources/META-INF/services/javax.xml.parsers.DocumentBuilderFactory (which defines com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl as the default)
%PROJECT_HOME%/src/main/resources/META-INF/services/javax.xml.parsers.SAXParserFactory (which defines com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl as the default)
%PROJECT_HOME%/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory (which defines com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl as the default)
Это мне не понятно.
Как перенести эти файлы в указанную директорию? и это рекомендуемое решение?
Обновление 2
Я попытался добавить аргумент VM -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
и это работает.
Однако ищем альтернативное и более подходящее решение. Это просто обходной путь. Когда приложение развертывается на сервере через, скажем, Jenkins, неправильно устанавливать эти параметры аргумента виртуальной машины, связанные с анализатором XML.
Обновление 3
Ответ @Ian Roberts решил проблему. Я очистил context.xml, чтобы последовательно использовать номер версии для xsd.
3 ответа
Ваше schemaLocation представляет собой смесь версий (spring-beans-3.2.xsd
) и неверсированный (spring-tx.xsd
) имена схем. Вы должны использовать один стиль или другой последовательно, а не смешивать их. Я подозреваю, что здесь происходит то, что вы явно ссылаетесь на версию 3.2 spring-bean, но одна из ваших неверсионных схем импортирует другую версию той же схемы, что приводит к двум противоречивым определениям beans:identifiedType
,
Этот пост довольно старый, но в любом случае я наткнулся на это сегодня и нашел причину и другое решение. Оказывается, что когда вы передаёте зависимость драйвера jracle jdbc через maven с помощью Oracle maven repo, он транзитивно получает другие библиотеки, которые вызывают эту проблему при разборе XML. Я просто исключил переходные зависимости для драйвера оракула, и все работает просто отлично. Я не думаю, что эти дополнительные библиотеки вообще необходимы во время выполнения.
Если у вас есть это в вашем пом:
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
Это дерево зависимостей:
- ojdbc7: 12.1.0.2
- xdb6: 12.1.0.2
- orai18n: 12.1.0.2
- xmlparserv2: 12.1.0.2 <- Culprit
- oraclepki: 12.1.0.2
- osdt_cert: 12.1.0.2
- osdt_core: 12.1.0.2
Таким образом, вы можете исключить нарушающую библиотеку следующим образом:
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
<exclusions>
<exclusion>
<artifactId>xmlparserv2</artifactId>
<groupId>com.oracle.jdbc</groupId>
</exclusion>
</exclusions>
</dependency>
Я фактически исключил все переходные зависимости, и все, кажется, работает просто отлично. Я не уверен, что они действительно используются. Я так не думаю, потому что вручную включить библиотеку jdbc просто скачав jar ojdbc.
Здесь есть ваше решение.
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl`