JAXB / MOXy - afterUnmarshal () вызывается непоследовательно - PullRequest
1 голос
/ 09 марта 2012

У меня проблема с тем, что методы afterUnmarshal() в моих классах не вызываются, если класс является членом коллекции.

Помимо объявления метода для класса, созданного с помощью unmarshalling,Есть ли другие шаги, которые я должен выполнить?(Я не вижу ничего другого в документах )

Вот тест, который показывает мою проблему:

Учитывая эти два класса домена:

@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 Ответ

1 голос
/ 09 марта 2012

Проблема, с которой вы столкнулись, связана со следующей ошибкой 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...