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`
Другие вопросы по тегам