Joa*_*nna 2 java xml jaxb marshalling xmltransient
我正在尝试将 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
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于注释冲突,这不起作用,因为我无法将任何其他 XML 注释与@XmlTransient. 我还尝试@XmlTransient在字段本身而不是 getter 上添加注释,并设置了此选项:
XmlAccessorType(XmlAccessType.FIELD)
此外,我将@XmlElement注释保留在设置器上,这对于排除该字段进行编组绝对没有任何作用。
我想保留@XmlElement注释,因为我希望能够将具有不同名称的字段(这里只是大小写差异)翻译成我想要的任何字段。
我也无法删除 getter,因为我确实在应用程序中使用了它。
鉴于此,我不知道此时我的选择是什么,除了编写一个适配器(我可以这样做,但如果有另一种解决方案,我宁愿不使用自定义适配器,因为这个字段)。任何帮助将不胜感激。
我认为你的问题在于这个想法本身:@XmlTransient告诉编组器在完成其工作时完全忽略该字段/属性,所以我猜这不是你正在寻找的,因为你不想(并且不能)无论如何)如果您想首先省略它,请为编组元素设置一个自定义名称。
另一点是,使用 JAXB,公共 getter/setter 与各自的对应项配对,因此应用于两者的注释在读取时会“合并”(因此您不能@XmlTransient在 getter 和 setter 中使用)@XmlElement同时setter 中使用) ,因此它们的位置也可以互换。
另外,为了清楚起见,@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;
}
}
Run Code Online (Sandbox Code Playgroud)如果两者都是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;
}
}
Run Code Online (Sandbox Code Playgroud)如果您想保留它的自定义名称:
如果该字段为,则仅在 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;
}
}
Run Code Online (Sandbox Code Playgroud)如果字段和访问器都是公共的(并且没有@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;
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4872 次 |
| 最近记录: |