7

我有一个可以很好地解组的 JAXB 对象。但是,如果我添加一个使用 @XmlAnyElement 注释的 Element[] 字段,则在尝试解组时会抛出:

java.lang.IllegalStateException:您正在使用无效的 JAXP api 或实现运行。需要 1.3.1 版(包含在 JDK6 中)或更高版本的 JAXP api/实现。如果您使用 ant,请确保使用 ant 1.7.0 或更高版本 - 旧版本的 ant 包含 JAXP api/impl 版本 1.2(在 xml-apis.jar 中)。如果您想继续使用旧的 ant 版本,则必须将其配置为使用更高的 JAXP api/impl 版本。

这是从我通过 Eclipse 插件运行的 TestNG 测试运行的。我正在使用 1.6 JDK 并配置 maven 以排除旧版本的 xml-apis jar 但是我似乎无法让它工作。我假设我仍在从某个地方获取不兼容的库版本,但不知道从哪里获取。

直接通过 Eclipse 运行我得到:

29-Aug-2013 10:04:08 com.sun.xml.bind.v2.util.XmlFactory createTransformerFactory
SEVERE: null
java.lang.AbstractMethodError: javax.xml.transform.TransformerFactory.setFeature(Ljava/lang/String;Z)V
    at com.sun.xml.bind.v2.util.XmlFactory.createTransformerFactory(XmlFactory.java:155)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.createTransformerHandler(JAXBContextImpl.java:747)
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader$State.<init>(DomLoader.java:75)
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:118)
    at com.sun.xml.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:60)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:501)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
    at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:218)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:190)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
    at com.gtspt.vrs.parser.AbstractParserTest.unmarshal(AbstractParserTest.java:33)
    at com.gtspt.vrs.parser.AbstractParserTest.testParser(AbstractParserTest.java:26)
    at com.gtspt.vrs.parser.TestResultsParser.testParser(TestResultsParser.java:17)
    at com.gtspt.vrs.parser.Test.main(Test.java:16)
4

6 回答 6

13

看起来问题是由于旧版本的 Xalan 造成的。从 JDK 5 开始,似乎至少需要 2.7.0 版本。另一个库正在引入旧版本,所以我从 Maven 构建中排除了它,现在一切看起来都很好。

于 2013-08-29T09:48:34.390 回答
5

In my case it was caused by old version of xercesImpl. Dependency below fixed it

 <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <version>2.11.0</version>
 </dependency>
于 2015-09-21T15:22:52.047 回答
2

我通过使用以下代码解决了这个问题。我在我的项目中使用JDK8

System.setProperty("javax.xml.transform.TransformerFactory", 
    "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); 
于 2019-04-25T09:46:48.987 回答
1

此外/支持,更具体地说,如果您正在运行 maven 或 JPA 项目,您应该能够右键单击依赖目录,添加依赖并搜索 xalan。在 xalan:xalan 列表下添加任何 2.7.0 及更高版本。

于 2014-10-29T14:33:12.433 回答
0

我通过从我的项目中删除 xalan 解决了这个问题。我在我的项目中使用 JDK7

于 2018-03-15T06:50:56.380 回答
0

我用完全相同的措辞遇到了同样的错误,但结果证明它与所建议的错误一样的依赖问题完全不同。所以我在这里分享我的遭遇,以防外面的人也能从中受益。

我的代码中有类似的东西:

public class ImageObject {

    @XmlElementWrapper(name="shapes")
    @XmlAnyElement(lax=true)
    @XmlElementRefs({
    @XmlElementRef(name = "circle", type=Circle.class),
    @XmlElementRef(name = "square", type=Square.class),
    @XmlElementRef(name = "rectangle", type=Rectangle.class),
    @XmlElementRef(name = "triangle", type=Triangle.class)
    })
    private List<Object> shapes;

    ...
}

在 Rectangle 类中,我在为 @XmlRootElement - "retangle"指定的元素名称中有错字,与 ImageObject 类中 @XmlElementRef 内的名称"rectangle"不匹配:

@XmlRootElement(name = "retangle")
public class Rectangle extends Shape {

    @XmlAttribute
    private String colour;

    @XmlAttribute
    private String width;

    ...
}

因此,如果您使用 @XmlElementRef 注释,也要注意这一点。

于 2016-04-29T06:37:29.370 回答