我正在尝试将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)
另外,我将
@XmlElement
批注保留在setter上,这对于排除将字段编组为绝对没有任何作用。我想保留
@XmlElement
注释,因为我希望能够将具有不同名称的字段(这里只是大小写不同)转换成我想要的任何字段。我也无法删除吸气剂,因为我确实在应用程序中使用了它。
鉴于此,除了编写适配器之外,我目前不知道我的选择(我可以这样做,但是如果有其他解决方案,由于这个字段,我宁愿不使用自定义适配器)。任何帮助将不胜感激。
最佳答案
我认为您的问题出在主意本身:@XmlTransient
告诉编组员在执行工作时完全忽略该字段/属性,所以我想这不是您想要的,因为您不想( (无论如何都无法),如果您想一开始就将其编组,则可以为编组后的元素设置自定义名称。
另一点是,对于JAXB,公共获取器/设置器与它们各自的对应器配对,因此应用于两者的注释在读取时会“合并”(因此,为什么不能在获取器中使用@XmlTransient
,而在设置器),因此它们的位置也可以互换。
另外,为清楚起见,@XmlElement
仅干扰@XmlAccessorType
成员的默认处理。如果有问题的字段或方法不是public
,则不会影响默认情况下的处理方式。
现在为解决方案:
如果要全部省略:
使用public
字段和private
getter / setter,只需在getter或setter中使用public
一次,什么都不要。
@XmlRootElement(name = "User")
public class User {
private String name;
@XmlTransient
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
如果两者均为
@XmlTransient
,则在字段中一次使用public
,然后在getter或setter中再次使用@XmlTransient
。@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
),则必须在任一字段中使用@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;
}
}