我有一个可能被多个客户端使用的类(即GUI,外部系统等)。
@XmlRootElement
class A {
String field = "Hello World";
public String getField() {
return field;
}
}
对于一个客户端,我不希望生成的XML包含类中的所有详细信息,因此我使用XmlTransient标记要隐藏的详细信息。
@XmlRootElement
class A {
String field = "Hello World";
@XmlTransient
public String getField() {
return field;
}
}
麻烦的是,其他客户需要查看该数据,现在它已被隐藏。
如果我有两个想要几乎相同数据的客户,我如何实现满足要求?我通过扩展A和适当注释以满足每个客户的需求来完成这项工作:
@XmlRootElement
class B extends A {
@XmlTransient
public String getField() {
return super.getField();
}
}
@XmlRootElement
class C extends A {
public String getField() {
return super.getField();
}
}
这有效,但看起来很麻烦。有没有其他方法可以做到这一点?我意识到在我展示的实例中我可以使用XmlJavaAdapter,但在我的现实代码中,我所指的数据可能是复合对象的一部分,而XmlJavaAdapter似乎不合适。
希望这一切都有意义!
答案 0 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
如@skaffman所述,您可以使用MOXy扩展来完成此用例。 MOXy提供了将映射元数据表示为XML的功能。这意味着您可以提供一个映射作为注释,以及另外的映射作为XML。
下面是一个示例链接,其中单个对象模型映射到Google和Yahoo天气服务的结果:
GitHub上也提供了与此示例对应的代码:
答案 1 :(得分:0)
我猜MOXy不是免费的(如果我错了请纠正我)。
我的免费解决方案是使用额外的"版本" JAXB对象中的字段用于区分多个版本的绑定。通常,我使用枚举作为其类型,即 枚举版本{V1,V2,...};
因此,对于原始示例,我将getField()方法定义为
@XmlElement
public String getField() {
if (version == Version.V1) {
return field;
} else if (version == Version.V2) {
return null; // hidden
}
}
对于客户端1,我将版本值设置为Version.V1,然后编组Java对象;对于客户端2,我将在编组之前将版本值更改为Version.v2。