Java-8 中 Xml 解组错误的任何替代解决方案? : “安全处理 org.xml.sax.SAXNotRecognizedException”
Any Alternate Solution to Xml Unmarshalling Error in Java-8? : “secure-processing org.xml.sax.SAXNotRecognizedException"
注意: 这个错误已经讨论过 here 并且还建议了各种解决方案来摆脱与 java-8's 冲突的 jar默认实现。
我的问题是对那个问题的扩展。
为了完整起见,这是我也面临的堆栈跟踪,当我 运行 带有 java-8 的代码时:
Feb 29, 2016 12:06:41 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory
SEVERE: null
org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing
at org.apache.xerces.parsers.AbstractSAXParser.setFeature(AbstractSAXParser.java:1487)
at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(SAXParserImpl.java:145)
at org.apache.xerces.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:128)
at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:112)
at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:140)
at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:121)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:276)
为了证明jar(s)冲突确实是问题(如之前分享的link中所述),我确实将相关代码提取到不同的项目中并成功运行使用 java-8 的代码(即没有任何错误)和最少数量的罐子。到目前为止一切顺利。
现在查询:
在我的例子中,我的遗留项目使用了大约 2-3 个已知的冲突 jar,出于各种原因。但是,有一个新模块使用注解驱动的 jaxb 进行 oxm 处理。
问题是:我无法摆脱那些旧的和冲突的 jar,因为这几乎使 10% 的代码库无法编译。但是,与此同时,我也不希望在新模块中删除 jaxb/oxm 实现。
有没有一种方法 我可以告诉 JVM 忽略旧的 jar 并使用 java-8 随代码提供的默认实现执行通过这个新模块?
另一种方法是使用 StAX 解析器将 XML 作为 XMLStreamReader
获取,然后让 JAXB 对其进行解组。
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(reader);
unmarshaller.unmarshal(xmlStreamReader);
有完全相同的问题!解决方案也对我有用。
注意 reader,我使用 FileReader 读取了一个 xml 文件,该文件解组良好。
注意: 这个错误已经讨论过 here 并且还建议了各种解决方案来摆脱与 java-8's 冲突的 jar默认实现。
我的问题是对那个问题的扩展。
为了完整起见,这是我也面临的堆栈跟踪,当我 运行 带有 java-8 的代码时:
Feb 29, 2016 12:06:41 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory
SEVERE: null
org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing
at org.apache.xerces.parsers.AbstractSAXParser.setFeature(AbstractSAXParser.java:1487)
at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(SAXParserImpl.java:145)
at org.apache.xerces.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:128)
at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:112)
at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:140)
at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:121)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:276)
为了证明jar(s)冲突确实是问题(如之前分享的link中所述),我确实将相关代码提取到不同的项目中并成功运行使用 java-8 的代码(即没有任何错误)和最少数量的罐子。到目前为止一切顺利。
现在查询:
在我的例子中,我的遗留项目使用了大约 2-3 个已知的冲突 jar,出于各种原因。但是,有一个新模块使用注解驱动的 jaxb 进行 oxm 处理。
问题是:我无法摆脱那些旧的和冲突的 jar,因为这几乎使 10% 的代码库无法编译。但是,与此同时,我也不希望在新模块中删除 jaxb/oxm 实现。
有没有一种方法 我可以告诉 JVM 忽略旧的 jar 并使用 java-8 随代码提供的默认实现执行通过这个新模块?
另一种方法是使用 StAX 解析器将 XML 作为 XMLStreamReader
获取,然后让 JAXB 对其进行解组。
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(reader);
unmarshaller.unmarshal(xmlStreamReader);
有完全相同的问题!解决方案也对我有用。 注意 reader,我使用 FileReader 读取了一个 xml 文件,该文件解组良好。