Я использую реализацию 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