JAX-B / JSON: наследование, составной шаблон, немаршальное исключение - PullRequest
0 голосов
/ 15 января 2012

Я работаю над 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: извините за мой плохой английский - надеюсь, его не так сложно читать / понимать

1 Ответ

0 голосов
/ 16 января 2012

Начните со схемы XML, которая описывает вашу объектную модель, затем запустите xjc или wsimport (инструменты из JDK), которые сгенерируют вам ваши классы Java.

...