我有一个可以解组的JAXB对象。但是,如果我添加一个用@XmlAnyElement注释的Element []字段,则在尝试解组它时会抛出:
java.lang.IllegalStateException:您运行的是无效的JAXP API或实现。需要JAXP api /版本1.3.1(包含在JDK6中)或更高版本的实现。如果你使用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)
答案 0 :(得分:12)
看起来这个问题是由旧版本的Xalan引起的。从JDK 5开始,似乎需要最低版本2.7.0。另一个库提供旧版本,因此我将其从Maven版本中排除,现在一切看起来都很好。
答案 1 :(得分:4)
在我的情况下,它是由xercesImpl
的旧版本引起的。下面的依赖关系固定它
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
答案 2 :(得分:1)
另外/支持并且更具体地说,如果您正在运行maven或JPA项目,您应该能够右键单击依赖项目录,添加依赖项并搜索xalan。在xalan:xalan列表下添加任何版本2.7.0及更高版本。
答案 3 :(得分: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”,与@内的名称“rectangle”不匹配ImageObject类中的XmlElementRef:
@XmlRootElement(name = "retangle")
public class Rectangle extends Shape {
@XmlAttribute
private String colour;
@XmlAttribute
private String width;
...
}
因此,如果您使用的是@XmlElementRef注释,请注意这一点。
答案 4 :(得分:0)
我通过从项目中删除xalan解决了这个问题。我在我的项目中使用JDK7
答案 5 :(得分:0)
我通过使用以下代码解决了此问题。我在项目中使用 JDK8
System.setProperty("javax.xml.transform.TransformerFactory",
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");