Java:Spring:阅读spring context.xml时出现XML冲突重复定义:'identifiedType'

spi*_*man 5 java xml spring spring-mvc

任何建议或帮助非常感谢.

有许多参考链接,但没有明确的解决方案.我想知道Spring项目如何与返回XMLType输出的PLSQL过程交互.你需要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>
Run Code Online (Sandbox Code Playgroud)

包括后xdb6xmlparserv2,我得到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]
Run Code Online (Sandbox Code Playgroud)

来自类路径资源[META-INF/spring/myapp-context.xml]的XML文档中的第16行无效;

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">
Run Code Online (Sandbox Code Playgroud)

Line16是 http://www.springframework.org/schema/cache/spring-cache.xsd">

假设我删除了Line16及其引用,然后在不同的行抛出相同的错误,比如第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]
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)

建议不要这样做,如链接 https://community.oracle.com/thread/1080787中所述

这里提到了另一个解决方案(与hibernate相关,但类似):在hibernate中使用Oracle XMLType列

在maven spring项目中,通过在%PROJECT_HOME%/ src/main/resources目录中创建以下文件来覆盖xmlparserv2.jar设置:

%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)
Run Code Online (Sandbox Code Playgroud)

这对我来说并不清楚.

如何将这些文件删除到上述目录?这是推荐的解决方案吗?

更新2

我尝试添加VM参数-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl ,但它确实有效.

但是寻找替代的,更合适的解决方案.这只是一种解决方法.当应用程序通过Jenkins部署到服务器时,不适合设置与XML解析器相关的这些VM参数设置.

更新3

@Ian Roberts的答案解决了这个问题.我清理了context.xml以始终使用xsd的版本号.

pak*_*man 11

这篇文章已经很老了,但无论如何我今天碰到了这个帖子,找到了原因和不同的解决方案.事实证明,当您使用Oracle的maven repo通过maven引入oracle jdbc驱动程序依赖项时,它会传递性地获取其他库,这会在解析XML时导致此问题.我刚刚排除了oracle驱动程序的传递依赖项,一切正常.我认为在运行时根本不需要那些额外的库.

如果你的pom中有这个:

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这是依赖树:

  • ojdbc7:12.1.0.2
    • xdb6:12.1.0.2
    • orai18n:12.1.0.2
    • xmlparserv2:12.1.0.2 < - 罪魁祸首
    • 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>
Run Code Online (Sandbox Code Playgroud)

我实际上排除了所有传递依赖,并且一切似乎都很好.我不确定它们是否真的被使用过.我不这么认为,因为包含jdbc库的手动方式是简单地下载ojdbc jar.


Xst*_*ian 7

这里有你的解决方案.

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl`
Run Code Online (Sandbox Code Playgroud)


Ian*_*rts 5

schemaLocation是versioned(spring-beans-3.2.xsd)和unversioned(spring-tx.xsd)模式名称的混合.您应该始终使用一种风格或另一种风格,而不是将两者混合使用.我怀疑这里发生的是你明确指的是spring-beans的3.2版本,但你的一个未版本化的模式导入了同一模式的不同版本,导致两个相互矛盾的定义beans:identifiedType.