JAXB-Eclipselink: сопоставление абстрактного геттера с XML

Я использую реализацию EclipseLink (2.3) JAXB для сопоставления POJO с XML и сталкиваюсь с проблемой со следующим вариантом использования:

public abstract class A {

    public abstract Set<X> getX();
    // There is no setter
}


public class B extends A {

    // Set via constructor
    private Set<X> x;

    @Override
    public Set<X> getX();

}

Я полностью определяю само сопоставление во внешнем файле привязок, я устанавливаю класс A как переходный, например:

<java-type name="foo.A" xml-transient="true"/>

и для класса В:

<java-type name="bar.B" xml-accessor-type="PROPERTY">
    <xml-root-element name="B" />
    <java-attributes>
        <xml-element java-attribute="x" xml-path="..."/>
    </java-attributes>
</java-type>

Теперь, после сортировки, я получаю исключение: «Повторяющееся свойство с именем [x] найдено в классе [bar.B]», которое, на мой взгляд, исходит из абстрактного объявления в A, наследуемого B.

Установка типа доступа для B в FIELD избавляет от этой ошибки, к сожалению, это не вариант, потому что у меня есть дополнительное свойство в B для маршалирования, которое возвращает не поле, а вычисленное значение, поэтому я застрял с PROPERTY (следующие работы: установка типа доступа для B в FIELD и сопоставление дополнительного свойства с аннотацией @XmlPath, но я не хочу аннотаций в своем коде).

Застряв на PROPERTY типа доступа для класса B, моей следующей попыткой было:

<java-type name="foo.A" xml-accessor-type="NONE"/>

чтобы предотвратить наследование абстрактного свойства B, что меня заводит:

Ignoring attribute [x] on class [bar.B] as no Property was generated for it.

То же самое происходит с использованием этого сопоставления:

<java-type name="foo.A" xml-accessor-type="PROPERTY">
    <java-attributes>
        <xml-transient java-attribute="x"/>
    </java-attributes>
</java-type>

В обоих случаях свойство 'x' игнорируется.

Я действительно потратил довольно много времени на это сейчас - я не могу представить, что это невозможно заставить это работать ??

Мой обходной путь на данный момент:

Оставив foo.A временным, указав FIELD типа доступа для bar.B (что без проблем дает мне свойство 'x') и сопоставление дополнительного свойства в B с помощью аннотации в коде. Но, как упоминалось ранее: я хотел бы решить это полностью без аннотаций - у кого-нибудь есть идеи? Блейз? :)

С уважением,

--qu


person quaylar    schedule 04.01.2012    source источник
comment
В настоящее время я изучаю вашу проблему, я опубликую ответ в ближайшее время.   -  person bdoughan    schedule 04.01.2012
comment
Здорово! Как-то связано: это поведение по умолчанию, когда свойства в суперклассах не отображаются по умолчанию, когда маршалируется подкласс? Я только что понял, что мне нужно переопределить их в подклассе, который многословен...   -  person quaylar    schedule 04.01.2012
comment
Похоже, вы столкнулись с ошибкой (bugs.eclipse.org/367886), в настоящее время мы изучаем ее. исправление. Не могли бы вы предоставить более подробную информацию о другой проблеме, с которой вы столкнулись: blog.bdoughan.com/p/contact_01. .html   -  person bdoughan    schedule 04.01.2012
comment
@Blaise_Doughan, большое спасибо за быстрый ответ! Я пойду на обходной путь, который я опубликовал выше, и буду следить за багтрекером. Что касается второго вопроса, я решил открыть отдельный вопрос, поскольку он может быть полезен и другим: Унаследованные свойства   -  person quaylar    schedule 05.01.2012