繁体   English   中英

具有继承但不使用子元素名称的JAXB

[英]JAXB with inheritance but without using child element names

我正在使用无法更改的供应商系统中的XML,并且正在尝试将JAXB与它一起使用。 XML用于REST之类的API。 请参阅下面的几个消息示例。 每个请求/消息都具有称为MsgRequest的相同根元素名称,它包含每个请求中的几个公共元素,但也包含依赖于消息类型的元素。

<!-- request 1 -->
<MsgRequest>
  <SubType>GetUser</SubType>
  <RequestID>1</RequestID>
  <UserName>joe</UserName>
</MsgRequest>

<!-- request 2 -->
<MsgRequest>
  <SubType>GetCompany</SubType>
  <RequestID>2</RequestID>
  <CompanyName>joe</CompanyName>
</MsgRequest>

从Java的角度来看,我可以使用继承对其进行建模。

class BaseMessage {
  String subType;
  Integer requestID;
};

class GetUserMessage {
  String userName;
};

class GetCompanyMessage {
  String companyName;
};

我不明白如何使用JAXB表示此XML。 我做了一些研究,发现XMLElementRef,但是它将封送被引用元素的名称,这不是我想要的。

希望我缺少明显的东西。 任何建议表示赞赏。

XML并非旨在适合任何特定语言甚至范式。 这意味着,但是您可以设计一个可以由Java类层次结构表示的XML,但不能保证您所使用的某些XML结构可以映射到类层次结构。 考虑到XML解析器必须能够根据元素的标记名确定XML元素的(复杂)类型。 因此,如果您有两个标记为<MsgRequest>元素,则必须将它们映射到单个Java类型。

您可以使用必需的字段subType和requestID以及可选的(minOccurs = 0)字段userName和companyName为单个复杂类型编写XML Schema。 它不是很好的OO风格,但是会生成您的XML。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM