我有2个班级:
@XmlRootElement
public class A {
private Long id;
private B b;
// setters and getters
}
和
@XmlRootElement
public class B {
private Long id;
private String field1;
private String field2;
// setters and getters
}
默认情况下,如果我将类A
的实例转换为XML,我将拥有其所有字段(id
)和引用的B
类字段({{1} },id
,field1
)像这样:
field2
是否可以修改引用的类<a>
<id>2</id>
<b>
<id>5</id>
<field1>test1</field1>
<field2>test3</field2>
</b>
</a>
中的哪些字段包含在B
类的XML中?例如。我想说,当我转换A
类的实例时,我只想从A
类中获取id
(没有B
和field1
字段),所以我想得到:
field2
我不想永久注释<a>
<id>2</id>
<b>
<id>5</id>
</b>
</a>
类(使用B
或@XMLTransient
)来实现它,因为在某些情况下我想要导出整个{{1类似于{使用@XMLElement
,B
和id
。)
从field1
引用field2
类时,我只是不想导出所有这些字段。
这对JAX-B来说是否可行?
答案 0 :(得分:99)
您可以使用注释@XmlTransient
来忽略字段。将此注释放在字段本身或其getter上。
答案 1 :(得分:19)
默认的JAXB绑定可以在全局范围内或根据需要在使用custom binding declarations或在字段上使用@XmlTransient
时根据需要进行覆盖。
从Baeldung网站Guide to JAXB查看此示例。
答案 2 :(得分:13)
好的,我已经提出了一些hacky解决方案:
@XmlRootElement
public class A {
private Long id;
private B b;
// setters and getters
}
我为REST用例提供了一个额外的getter,所以它就像:
@XMLTransient
public B getB() {
return b;
}
@XMLElement(name="b")
public Long getBForREST() {
return b.getId();
}
它产生以下结构:
<a>
<id>2</id>
<b>5</b>
</a>
这与我的目标并不完全相同,因为它适用于我。
我不喜欢这个解决方案 - @XMLExclude({"field1", "field2"})
或类似的东西在我看来会更清晰。
尽管如此 - 现在,它有效;它很难看,但它确实有效。