仅 getter 上的 XmlTransient 注释?

XmlTransient annotation on getter only?

我正在尝试将 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
    }
}

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

XmlAccessorType(XmlAccessType.FIELD)

此外,我在 setter 上保留了 @XmlElement 注释,这在排除该字段被编组方面绝对没有任何作用。

我想保留 @XmlElement 注释,因为我喜欢能够将具有不同名称(这里只是大小写差异)的字段翻译成我想要的任何字段。

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

鉴于此,除了编写适配器(我可以这样做,但如果有其他解决方案,我宁愿不使用自定义适配器,因为这一领域)。任何帮助将不胜感激。

我认为你的问题出在想法本身:@XmlTransient 告诉编组器在完成它的工作时完全忽略 field/property,所以我猜这不是你要找的, 因为如果您想首先省略它,您不想(无论如何也不能)为编组元素设置自定义名称。

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

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

现在给出解决方案:

  • 如果要全部省略:

    • With 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;
          }
      }
      
    • 如果字段和访问器都是public(没有@XmlAccessorType或者设置为XmlAccessType.PUBLIC_MEMBER),那么你就必须使用@XmlTransient 在任一字段中或 getter/setter 和 @XmlElement 在另一个字段中(如果所有方法所做的只是 reading/writing 值,它们将可以互换,如本例所示)。

      @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;
          }
      }