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