多个客户端需要不同的JAXB注释

时间:2012-01-12 16:11:15

标签: java jaxb

我有一个可能被多个客户端使用的类(即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似乎不合适。

希望这一切都有意义!

2 个答案:

答案 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。