JAXB / MOXy - afterUnmarshal()似乎被称为不一致

时间:2012-03-09 03:20:20

标签: java jaxb eclipselink

如果类是集合的成员,我在调用类的afterUnmarshal()方法时会遇到麻烦。

除了在通过解组创建的类上声明方法之外,还有其他步骤需要执行吗? (我在the docs

中看不到任何其他内容

这是一个测试,显示我遇到的问题:

鉴于这两个域类:

@XmlRootElement(name="Parent")
public class Parent {

    public boolean unmarshalCalled = false;

    @XmlPath("Children/Child")
    List<Child> children;

    void afterUnmarshal(Unmarshaller u, Object parent)
    {
        unmarshalCalled = true;
    }
}


@XmlAccessorType(XmlAccessType.FIELD)
public class Child {

    public boolean unmarshalCalled = false;

    @Getter @Setter
    @XmlPath("@name")
    private String name;

    void afterUnmarshal(Unmarshaller u, Object parent)
    {
        unmarshalCalled = true;
    }
}

此测试失败:

public class UnmarshalTest {

    @Test
    @SneakyThrows
    public void testUnmarshal()
    {
        String xml = "<Parent><Children><Child name='Jack' /><Child name='Jill' /></Children></Parent>";
        JAXBContext context = getContext();
        Parent parent = (Parent) context.createUnmarshaller().unmarshal(new StringReader(xml));
        assertTrue(parent.unmarshalCalled);
        for (Child child : parent.children)
        {
            assertThat(child.getName(),notNullValue());
            assertTrue(child.unmarshalCalled); // This assertion fails
        }
    }
    @SneakyThrows
    public static JAXBContext getContext()
    {
        JAXBContext context;
        context = org.eclipse.persistence.jaxb.JAXBContext.newInstance(Parent.class);
        return context;
    }
}

这是一个错误,还是我错过了一些步骤才能让它正常工作?

1 个答案:

答案 0 :(得分:1)

您看到的问题是由于以下EclipseLink MOXy错误:

此错误已在EclipseLink 2.3.3流中修复,每晚下载可从以下位置获取:

解决方法

您可以通过确保所有带有事件方法的类都包含在传入的类数组中来创建JAXBContext来解决您遇到的问题。我已经修改了下面的代码来执行此操作:

@SneakyThrows
public static JAXBContext getContext()
{
    JAXBContext context;
    context = org.eclipse.persistence.jaxb.JAXBContext.newInstance(Parent.class, Child.class);
    return context;
}