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

Java 多个客户端需要不同的JAXB注释,java,jaxb,Java,Jaxb,我有一个类可能被多个客户端(即GUI、外部系统等)使用 对于一个客户机,我不希望生成的XML包含类中的所有详细信息,因此我用XmlTransient标记了要隐藏的详细信息 @XmlRootElement class A { String field = "Hello World"; @XmlTransient public String getField() { return field; } } 问题是,另一个客户端需要查看该数据,而现在它被隐

我有一个类可能被多个客户端(即GUI、外部系统等)使用

对于一个客户机,我不希望生成的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似乎不合适


希望这一切都有意义

注意:我是专家组的负责人和成员

正如所提到的,您可以使用MOXy扩展来完成这个用例。MOXy提供了将映射元数据表示为XML的能力。这意味着您可以提供一个映射作为注释,再加上其他映射作为XML

下面是一个示例链接,其中单个对象模型映射到Google和Yahoo气象服务的结果:

GitHub上也提供了与此示例对应的代码:

    • 我想莫西没有空(如果我错了,请纠正我)

      我的免费解决方案是在JAXB对象中使用一个额外的“version”字段来区分绑定的多个版本。通常,我使用enum作为其类型,即。, 枚举版本{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

      标准JAXB不是实现这一点的合适工具,您需要将映射描述符外部化。不过,像MOXy这样的专有扩展可能能够做到这一点。
      @XmlElement
      public String getField() {
          if (version == Version.V1) {
              return field;
          } else if (version == Version.V2) {
              return null; // hidden
          }
      
      }