【问题标题】:XmlTransient annotation on getter only?仅在 getter 上的 XmlTransient 注释?
【发布时间】:2018-06-26 15:11:40
【问题描述】:

我正在尝试将 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 一起使用。我还尝试在字段本身而不是 getter 上添加 @XmlTransient 注释并设置了此选项:

XmlAccessorType(XmlAccessType.FIELD)

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

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

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

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

【问题讨论】:

    标签: java xml jaxb marshalling xmltransient


    【解决方案1】:

    我认为您的问题在于想法本身:@XmlTransient 告诉编组器在执行其工作时完全忽略该字段/属性,所以我猜这不是您要查找的内容,因为您不会如果您想一开始就省略它,想要(并且无论如何不能)为编组元素设置自定义名称。

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

    另外,为了清楚起见,@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),那么您必须在任一字段或 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;
            }
        }
        

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 2023-03-19
      • 2012-06-09
      • 2014-03-09
      • 2010-11-04
      • 2023-03-15
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多