仅在getter上使用XmlTransient注释?

时间:2018-01-17 16:50:56

标签: java xml jaxb marshalling xmltransient

我正在尝试将XML解组为一个我期望应该具有某个字段的对象。但是,我不想将该对象编组为包含它的XML。我喜欢的与此类似:

@XmlRootElement(name = "User")
public class User {

    private String name;

    @XmlTransient
    public String getName() {
        return this.name
    }

    @XmlElement(name = "Name")
    public void setName(String name) {
        this.name = name
    }
}

但是,由于注释冲突,这不起作用,因为我不能使用@XmlTransient的任何其他XML注释。我还尝试在字段本身而不是getter上添加@XmlTransient注释,并设置了此选项:

XmlAccessorType(XmlAccessType.FIELD)

此外,我将@XmlElement注释保留在setter上,并且在排除字段被编组方面完全没有任何意义。

我想保留@XmlElement注释,因为我希望能够将具有不同名称的字段(此处只是大写差异)转换为我想要的任何字段。

我也无法删除getter,因为我在应用程序中使用它。

考虑到这一点,我不知道我的选择是什么,除了编写一个适配器(我可以做,但如果有另一个解决方案,我宁愿不使用自定义适配器,因为这个领域)。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为你的问题在于这个想法本身:@XmlTransient告诉编组人员在完成工作时完全忽略该字段/属性,所以我猜测它不是你所做的&#39 ;如果你想首先省略它,那么你正在寻找(并且无论如何)为编组元素设置一个自定义名称。

另一点是,对于JAXB,公共getter / setter与它们各自的对应物配对,因此应用于两者的注释是" merged"阅读时(因此你不能同时在getter和@XmlTransient中使用@XmlElement),因此他们的位置也可以互换。

另外,为了清楚起见,@XmlAccessorType仅干扰 public 成员的默认处理。如果相关字段或方法 public,则默认情况下不会影响其处理方式。

现在解决方案:

  • 如果您想省略所有内容:

    • 使用private字段和public getter / setter,只需在getter或setter中使用@XmlTransient一次即可。

      @XmlRootElement(name = "User")
      public class User {
      
          private String name;
      
          @XmlTransient
          public String getName() {
              return this.name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      
    • 如果两者都是public,请在字段中使用@XmlTransient一次,然后在getter或setter中再次使用。

      @XmlRootElement(name = "User")
      public class User {
      
          @XmlTransient
          public String name;
      
          @XmlTransient
          public String getName() {
              return this.name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      
  • 如果您希望使用自定义名称保留它:

    • 如果该字段为private,请在getter或setter中仅使用@XmlElement一次。

      @XmlRootElement(name = "User")
      public class User {
      
          private String name;
      
          @XmlElement(name = "Name")
          public String getName() {
              return this.name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      
    • 如果字段和访问者都是公开的(并且没有@XmlAccessorType或它设置为XmlAccessType.PUBLIC_MEMBER),那么您将不得不使用{* 1}}在任一字段或getter / setter中@XmlTransient@XmlElement在另一个中(如果所有方法都只是读取/写入值,它们将是可互换的,如本例所示)。

      @XmlRootElement(name = "User")
      public class User {
      
          @XmlTransient
          public String name;
      
          @XmlElement(name = "Name")
          public String getName() {
              return this.name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }