@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

没有 @XMLRootElement 的 JAXB 部分解组元素

jakarta.xml.bind.annotation.XmlRootElement 是不是可用?

JAXB注解 @XmlRootElement 及XML文件解析详解

没有由 JAXB 生成的 @XmlRootElement

在 JaxB 编组没有 @XmlRootElement 注释的元素时删除 ns2 前缀