2

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

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

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

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

鉴于此,我现在不知道我的选择是什么,除了编写一个适配器(我可以这样做,但如果有另一种解决方案,我宁愿不使用自定义适配器,因为这个字段)。任何帮助将不胜感激。

4

1 回答 1

4

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

另一点是,对于 JAXB,公共 getter/setter 与它们各自的对应物配对,因此应用于两者的注释在读取时会“合并”(因此为什么不能同时@XmlTransient在 getter 和@XmlElementsetter 中使用) ,因此它们的位置也可以互换。

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

现在为解决方案:

  • 如果你想全部省略:

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

      @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;
          }
      }
      
  • 相反,如果您想使用自定义名称保留它:

    • 如果字段是,则在 getter 或 setter 中private仅使用一次。@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),那么您必须@XmlTransient在任一字段或 getter/setter 和@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;
          }
      }
      
于 2018-05-30T17:15:29.367 回答