Сбой Marshalling за исключением того, что MarshallerImpl не известен в этом контексте - PullRequest
6 голосов
/ 22 февраля 2012

У меня есть относительно простой пакет из 8 классов Java, сгенерированных из схемы XML с использованием JAXB XJC.У меня также есть служебный класс для маршалирования и демаршализации экземпляров класса.

Это работает

Служебный класс может успешно разархивировать действительный документ XML в экземпляр корневого класса WordMergeInfo.Например, это работает нормально:

    JAXBContext jc = JAXBContext.newInstance(WordMergeInfo.class);
    Unmarshaller um = jc.createUnmarshaller();
    return (WordMergeInfo)um.unmarshal(inputStream);

Это не работает

Но сортировка строки не удалась.В этом коде:

    JAXBContext jc = JAXBContext.newInstance(WordMergeInfo.class);
    Marshaller m = jc.createMarshaller();
    StringWriter writer = new StringWriter();
    m.marshal(m, writer);
    return writer.toString();

вызов Marshaller.marshal завершается с ошибкой:

javax.xml.bind.JAXBException: class com.sun.xml.bind.v2.runtime.MarshallerImpl nor any of its super class is known to this context.
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:594)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:482)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)

Насколько я понимаю, nor any of its super class is known to this context означает, что класс JAXB необходим для маршаллингане может быть найден.Так почему же нельзя найти один из классов реализации JAXB, когда тот же класс находится в трассировке стека?

Context

Эта ошибка обнаружилась в модульном тесте моего класса, runпод Maven.Зависимости:

  • javax.xml.bind: jaxb-api: 2.1
  • com.sun.xml.bind: jaxb-impl: 2.1.13

Я получил ту же ошибку с более ранними версиями (2.0 и 2.0.3, соответственно).

Путь к классу тестирования Maven:

C:\Users\mstra.CUSTMAN\Workspace\DARTCorrModule\xml\target\test-classes
C:\Users\mstra.CUSTMAN\Workspace\DARTCorrModule\xml\target\classes
C:\Users\mstra.CUSTMAN\.m2\repository\javax\xml\bind\jaxb-api\2.1\jaxb-api-2.1.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar
C:\Users\mstra.CUSTMAN\.m2\repository\com\sun\xml\bind\jaxb-impl\2.1.13\jaxb-impl-2.1.13.jar
C:\Users\mstra.CUSTMAN\.m2\repository\junit\junit\4.8.2\junit-4.8.2.jar
C:\Users\mstra.CUSTMAN\.m2\repository\org\mockito\mockito-all\1.8.5\mockito-all-1.8.5.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\ejb\ejb-api\3.0\ejb-api-3.0.jar
C:\Users\mstra.CUSTMAN\.m2\repository\org\slf4j\slf4j-api\1.6.4\slf4j-api-1.6.4.jar

Любое понимание приветствуется.

1 Ответ

7 голосов
/ 22 февраля 2012

ни один из его суперкласса не известен в этом контексте

Это означает, что класс не зарегистрирован как маршализуемый класс в контексте JAXB.

Ваша ошибка в этой строке:

m.marshal(m, writer);

Вы пытаетесь маршалировать самого маршаллера. Вы, вероятно, хотели собрать WordMergeInfo объект.

...