任何建议或帮助都是非常感谢的。
有很多参考链接,但没有明确的解决方案。我想知道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>
在包含xdb6
和xmlparserv2
之后,我在Spring应用程序启动时(在运行服务器时)得到以下错误
2014-08-19 18:28:51898 INFO | main | o.s.s beans.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]
类路径资源[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">
Line16 is http://www.springframework.org/schema/cache/spring-cache.xsd">
假设我删除了第16行及其引用,那么同样的错误会在另一行抛出,比如第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属性添加到应用服务器启动参数中。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相关,但类似):在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)
我不清楚。
如何将这些文件放入上述目录?这是推荐的解决方案吗?
更新2
我试着添加VM参数-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
,它工作。
然而,寻找一个替代的,更合适的解决方案。这只是一个变通办法。当应用程序通过Jenkins部署到服务器时,设置这些与XML解析器相关的VM参数设置是不合适的。
更新3
@Ian Roberts的回答修复了这个问题。我清理了context.xml以一致地使用xsd的版本号。
这篇文章很老了,但无论如何我今天偶然发现了这篇文章,找到了原因和一个不同的解决方案。事实证明,当您使用oracle的maven repo通过maven引入oracle jdbc驱动程序依赖时,它会传递地获得其他库,从而在解析xml时导致此问题。我只是排除了oracle驱动程序的传递依赖关系,一切都很好。我认为这些额外的库在运行时根本没有必要。
如果你有这个在你的诗:
<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 & lt;——罪魁祸首
- 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库的手动方式是简单地下载ojdbc jar。
这就是你的解决方案。
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl`
schemaLocation是有版本(spring-beans-3.2.xsd
)和无版本(spring-tx.xsd
)模式名称的混合。你应该始终如一地使用其中一种风格,而不是混合使用两种风格。我怀疑这里发生的事情是您显式地引用了spring-beans的3.2版本,但是您的一个未版本化的模式导入了同一模式的不同版本,导致beans:identifiedType
的两个定义相互冲突。