使用JAXB解组时将空元素转换为null

tor*_*gat 11 java jaxb

使用以下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.有什么建议?

tor*_*gat 5

这里有一个解决方案的工作.再次,优雅被遗忘.

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的签名将来会发生什么变化呢?这段代码将神秘地停止工作,因为它应该.