Java @XmlRootElement和<;T扩展可序列化>;抛出IllegalAnnotationExceptions

Java @XmlRootElement和<;T扩展可序列化>;抛出IllegalAnnotationExceptions,java,jaxb,serializable,Java,Jaxb,Serializable,当我整理这个类的一个实例时 @XmlRootElement public static class TestSomething<T extends Serializable> { T id; public T getId() { return id; } public void setId(T id) { this.id = id; } } 如何避免这种情况(不将类型参数更改为类似于)?是如何使用JAXB

当我整理这个类的一个实例时

@XmlRootElement
public static class TestSomething<T extends Serializable> {

    T id;

    public T getId() {
        return id;
    }

    public void setId(T id) {
        this.id = id;
    }
}
如何避免这种情况(不将类型参数更改为类似于
)?

是如何使用JAXB接口的指南


JAXB需要具体的类,因为它在从XML编组时必须实例化它们。如果
T
不是具体的类,则无法实例化它。

您需要使用@xmlement和@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 java.io.Serializable;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlSchemaType;
@XmlRootElement
公共类TestSomething{
T-id;
@XmlElement(类型=Object.class)
@XmlSchemaType(name=“anySimpleType”)
公共T getId(){
返回id;
} 
公共无效集合id(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);
    }
}
import javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Marshaller;
公开课演示{
公共静态void main(字符串[]args)抛出JAXBEException{
JAXBContext jc=JAXBContext.newInstance(TestSomething.class);
TestSomething foo=newtestsomething();
foo.setId(4);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(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>

4.

@xmlanyement
添加到“id”字段(以及类级别的
@xmlacessortype(xmlacesstype.field)
注释)或为getter添加相同的注释将解决此问题。(但它使xml元素的类型
any

我已经找到了这本指南,但它对我帮助不大。当我将@xmlanyement放入getId()并尝试封送TestSomething的实例时,我得到com.sun.istack.SAXException2:无法将类型“java.lang.Long”封送为元素,因为它缺少@XmlRootElement注释有没有办法将
id
字段放入属性而不是单独的元素?我试图序列化一个类似于OP的对象,但是当我尝试使用
@xmltattribute
时,JAXB确实不喜欢。如果需要的话,我将打开一个新问题。@Matt Ball-如果您使用EclipseLink JAXB(MOXy),上述场景将与@xmltribute一起工作。对于Metro JAXB实现,我遇到了一个例外,我确实尝试过从Metro切换到MOXy。如果
,那么我会得到与OP相同的错误,以及“@xmldattribute/@XmlValue需要引用映射到XML中文本的Java类型”。如果只是
,那么我会在JAXB(堆栈跟踪)的内部深处得到一个NPE。地铁也会出现同样的NPE。有什么想法吗?为了不劫持这个问题,我发布了。如果你能看一下,我将不胜感激。谢谢
<?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>