Я работаю над RESTful WebService (NetBeans + Jersey) и пытаюсь реализовать UI-описание (Label, Buttons, ...) для мобильных приложений (Android).
Я использовал Composite-Design-Pattern для создания UIContainer, UIBasicElements, UIComplexElements и так далее ...
Моя проблема:
Контейнер UIC содержит
private List<UIComponent> uiComponents;
.
Если я добавлю
@XmlSeeAlso( {
UIBasicLabel.class,
UIBasicIcon.class,
UIBasicButton.class,
...
} )
в класс public abstract class UIComponent
я получаю нужный мне JSON-формат, то есть что-то вроде
{ ..., uiComponents : [ {Label} , {Icon} , ... ] , ... }
, который я могу обработать на моем Android-клиенте.
Я также заметил, что свойство @type : ClassName
добавлено в JSON-Output.
Разве это не добавлено, чтобы дать подсказку демаршаллеру, какой класс использовать?
С клиентом из Джерси я получаю исключение при демаршаллинге:
Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; Unable to create an instance of de.materna.mobile.management.entities.uidescription.UIComponent]
Насколько я понимаю, мне нужно изменить UIContainer.class на
@XmlElementRef
private List<UIComponent> uiComponents;
чтобы демаршаллер знал, что здесь десериализовать.
Однако моя проблема в том, что с @XmlElementRef
JSON становится таким:
{ ..., Label : [ ... ] , Icon : [ ... ], ... }
вместо
{ ..., uiComponents : [ {Label} , {Icon} , ... ] , ... }
Есть ли способ выполнить оба?
Большое спасибо!
P.S: извините за мой плохой английский - надеюсь, его не так сложно читать / понимать