@XmlRootElement和 抛出IllegalAnnotationExceptions
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@XmlRootElement和 抛出IllegalAnnotationExceptions相关的知识,希望对你有一定的参考价值。
当我策划这个班级的一个实例时......
@XmlRootElement
public static class TestSomething<T extends Serializable> {
T id;
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
}
...抛出以下异常......
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
java.io.Serializable is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.io.Serializable
at public java.io.Serializable TestSomething.getId()
at TestSomething
java.io.Serializable does not have a no-arg default constructor.
this problem is related to the following location:
at java.io.Serializable
at public java.io.Serializable TestSomething.getId()
at TestSomething
如何避免这种情况(不将类型参数更改为<T>
)?
答案
您需要使用@XmlElement和@XmlSchemaType的组合:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
@XmlRootElement
public class TestSomething<T extends Serializable> {
T id;
@XmlElement(type=Object.class)
@XmlSchemaType(name="anySimpleType")
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
}
如果您运行以下内容:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws JAXBException {
JAXBContext jc = JAXBContext.newInstance(TestSomething.class);
TestSomething<Integer> foo = new TestSomething<Integer>();
foo.setId(4);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
你会得到:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testSomething>
<id xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">4</id>
</testSomething>
另一答案
Here是如何使用JAXB接口的指南。
JAXB需要具体的类,因为它必须在从XML编组时实例化它们。如果T
不是具体类,则无法实例化。
另一答案
将@XmlAnyElement
添加到'id'字段(以及类级别的@XmlAccessorType(XmlAccessType.FIELD)
注释)或为getter添加相同内容将解决此问题。 (但它使xml元素的类型为any
。)
以上是关于@XmlRootElement和 抛出IllegalAnnotationExceptions的主要内容,如果未能解决你的问题,请参考以下文章
没有 @XMLRootElement 的 JAXB 部分解组元素
jakarta.xml.bind.annotation.XmlRootElement 是不是可用?