我正在尝试将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,因为我在应用程序中使用它。
考虑到这一点,我不知道我的选择是什么,除了编写一个适配器(我可以做,但如果有另一个解决方案,我宁愿不使用自定义适配器,因为这个领域)。任何帮助将不胜感激。
答案 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;
}
}