使用以下JAXB注释定义类:
class Course {
@XmlElement (name = "book")
List<Book> requiredBooks = new ArrayList<Book>();
Run Code Online (Sandbox Code Playgroud)
解组包含此文档的XML文档时
<course>
...
<book/>
</course>
Run Code Online (Sandbox Code Playgroud)
我最终将一个Book添加到列表中,其所有属性都设置为null.我不控制XML输入.如何防止添加此空白书?我尝试拦截set ..()或添加..()方法,但是在处理集合时,JAXB绕过了setter.有什么建议?
这里有一个解决方案做的工作.再次,优雅被遗忘.
JAXB定义了两个回调:beforeUnmarshal和afterUnmarshal.通过实现afterUnmarshal来清理列表,我能够实现所需的结果.
class Course
{
@XmlElement (name = "book")
List<Book> requiredBooks = new ArrayList<Book>();
...
void afterUnmarshal(Unmarshaller aUnmarshaller, Object aParent)
{
if (requiredBooks != null)
{
Iterator<Book> iterator = requiredBooks.iterator();
while (iterator.hasNext())
{
Book book = iterator.next();
if (StringUtils.isEmpty(book.getTitle()))
{
// a book without title is considered invalid
iterator.remove();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这是有效的,但最大的问题是没有用于实现afterUnmarshal的接口.它是由JAXB使用反射查找的,但我认为如果JAXB只提供接口和/或抽象实现,那将会很方便(并且会减少调试/维护).如果是,如果afterUnmarshal的签名将来会发生什么变化呢?这段代码将神秘地停止工作,因为它应该.