@XmlRootElement и <T extends Serializable> генерируют исключения IllegalAnnotationExceptions - PullRequest
2 голосов
/ 19 сентября 2010

Когда я собираю экземпляр этого класса ...

@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>)?

Ответы [ 3 ]

1 голос
/ 20 сентября 2010

Вам необходимо использовать комбинацию @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>
0 голосов
/ 26 декабря 2017

Добавление @XmlAnyElement в поле 'id' (вместе с аннотацией @XmlAccessorType(XmlAccessType.FIELD) на уровне класса) или добавление того же самого для getter решит эту проблему.(Но это делает тип элемента xml any.)

0 голосов
/ 19 сентября 2010

Здесь - руководство по использованию интерфейсов с JAXB.

JAXB нужны конкретные классы, потому что он должен создавать их экземпляры при сортировке из XML.И если T не конкретный класс, его нельзя создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...