moxy jaxb @XmlID и наследование - PullRequest
2 голосов
/ 03 августа 2011

У меня следующая иерархия:

public class Small {
    private String xmlId;

    @XmlID
    @XmlAttribute
    public String getXmlId() {
        if (xmlId == null)
            xmlId = "small" + new Random().nextInt();
        return xmlId;
    }

    public void setXmlId(String id) {
        this.xmlId = id;
    }
}

public class Big extends Small {
    // Code
}

Где я пытаюсь упорядочить класс Baz:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Baz {
    private List<Small> smalls = new LinkedList<Small>();

    private Small small;
    private Big big;

    @XmlIDREF
    public Small getSmall() {
        return small;
    }

    public void setSmall(Small small) {
        this.small = small;
    }

    @XmlIDREF
    public Big getBig() {
        return big;
    }

    public void setBig(Big big) {
        this.big = big;
    }

    @XmlElementWrapper(name = "smalls")
    @XmlElement(name = "small")
    public List<Small> getSmalls() {
        return smalls;
    }

    public void setSmalls(List<Small> smalls) {
        this.smalls = smalls;
    }
}

Я использую следующий тестовый код:

public class Test2 {
    public static void main(String[] args) throws Exception {
        Small s1 = new Small();
        Small s2 = new Small();
        Big b1 = new Big();

        List<Small> smalls = new LinkedList<Small>();
        smalls.add(s1);
        smalls.add(s2);
        smalls.add(b1);

        Baz baz = new Baz();
        baz.setSmalls(smalls);
        baz.setSmall(s2);
        baz.setBig(b1);

        JAXBContext jc = JAXBContext.newInstance(Baz.class);
        Marshaller m = jc.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.marshal(baz, System.out);
    }
}

К сожалению, при выполнении маршала я сталкиваюсь со следующим исключением:

Exception in thread "main" javax.xml.bind.JAXBException: 
Exception Description: Invalid XmlIDREF on property [big].  Class [test.moxy.Big] is required to have a property annotated with XmlID.

Я ожидаю, что аннотация XmlID будет унаследована классом Big.Я попытался добавить «другую» аннотацию @XmlID в класс Big, которая устраняет проблему с маршалом.Это, однако, приводит к другой проблеме при создании XML-схемы, которая теперь будет содержать два атрибута ID, что недопустимо.

Я что-то не так делаю?

1 Ответ

1 голос
/ 03 августа 2011

Поведение, которое вы видите, является ошибкой (https://bugs.eclipse.org/353787). Мы отметили исправление для потоков EclipseLink 2.3.1 и 2.4.0, которое будет доступно на нашей странице ночной загрузки, начиная с 4 августа 2011 года:

...