Используя Eclipselink/MOXy 2.3, у меня есть следующий вариант использования при маршаллинге в XML:
abstract class MyAbstract {
}
class MyImpl extends MyAbstract {
}
class A {
private MyAbstract myAbstract;
// MyImpl is behind this
public MyAbstract getMyAbstract() {
return myAbstract;
}
}
У меня есть следующее сопоставление, определенное в oxm.xml:
<java-type name="foo.MyAbstract" xml-accessor-type="NONE">
<xml-see-also>
foo.MyImpl
</xml-see-also>
</java-type>
<java-type name="foo.MyImpl">
<xml-root-element name="MyImpl" />
</java-type>
<java-type name="bar.A" xml-accessor-type="NONE">
<xml-root-element name="A" />
<java-attributes>
<xml-element java-attribute="myAbstract" type="foo.MyAbstract" />
</java-attributes>
</java-type>
Теперь это приводит к:
<A>
<myAbstract xsi:type="myImpl">
<!-- Mapped members of MyImpl + MyAbstract -->
</myAbstract>
</A>
Поскольку мне не нужно имя свойства в экспортированном xml, я изменил:
<java-type name="bar.A" xml-accessor-type="NONE">
<xml-root-element name="A" />
<java-attributes>
<xml-element java-attribute="myAbstract" type="foo.MyAbstract" xml-path="."/>
</java-attributes>
</java-type>
что привело к:
<A>
<!-- Members of MyImpl + MyAbstract marshalled without any wrapping element-->
</A>
Я хочу:
<A>
<MyImpl>
<!-- Members of MyImpl + MyAbstract -->
</MyImpl>
</A>
Вопрос: как мне этого добиться? MOXy просто игнорирует мой XmlRootElement на MyImpl...
ИЗМЕНИТЬ:
Попытка того, что предложил Блейз, дает мне следующее исключение:
Exception [EclipseLink-60] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.DescriptorException
The method [] or [getMyAbstract] is not defined in the object [bar.A].
Теперь для этого нужна дополнительная информация, которую я пропустил раньше, потому что я думал, что это не имеет значения:
Класс A — это интерфейс, который определяет: public X getMyAbstract();
MyAbstract реализует X (именно поэтому я добавил атрибут type в отображение для интерфейса A).
Таким образом, использование xml-element-ref
MOXy больше не "видит" геттер, а использование xml-element
видит.
A
соответствует интерфейсуCustomer
в моем примере, вам все равно нужно будет выполнить загрузку и сопоставить JAXBContext с классом impl,CustomerImpl
в моем примере. - person bdoughan   schedule 16.01.2012