JAX-B / JSON:继承,复合模式,unmarshal异常

时间:2012-01-15 19:08:17

标签: json inheritance jaxb jersey unmarshalling

我正在开发一个RESTful WebService(NetBeans + Jersey)并尝试为移动应用程序(Android)实现UI描述(标签,按钮......)。

我使用Composite-Design-Pattern创建了UIContainer,UIBasicElements,UIComplexElements等等......

我的问题是: UIContainer包含一个 private List<UIComponent> uiComponents;

如果我添加

@XmlSeeAlso( { 
    UIBasicLabel.class, 
    UIBasicIcon.class, 
    UIBasicButton.class,
    ... 
} )

到类public abstract class UIComponent我得到了我想要的JSON格式,例如

{ ..., uiComponents : [ {Label} , {Icon} , ... ] , ... }

我可以在我的Android-Client上处理。 我还注意到,JSON-Output中添加了@type : ClassName属性。 这不是为了给unmarshaller提供一个暗示,使用什么类?

使用Jersey-Client,我会在解组时遇到异常:

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;

所以unmarshaller知道在这里反序列化的内容。

然而,我的问题是,@XmlElementRef JSON变成了这个:

{ ..., Label : [ ... ] , Icon : [ ... ], ... }

而不是

{ ..., uiComponents : [ {Label} , {Icon} , ... ] , ... }

有没有办法实现这两个目标?

非常感谢!

P.S:抱歉我的英语不好 - 我希望阅读/理解

并不难

1 个答案:

答案 0 :(得分:0)

从描述对象模型的XML模式开始,然后运行xjc或wsimport(来自JDK的工具),这将生成您的Java类。