Выдающаяся ошибка: javax.xml.bind.JAXBException: ни класс, ни какой-либо из его суперклассов не известны этому контексту - PullRequest
0 голосов
/ 05 апреля 2019

Когда я выполнял маршалинг объекта, я получил это исключение: javax.xml.bind.JAXBException: подписка класса, ни один из его суперклассов не известен этому контексту.

Я знаю, что есть решения @XmlSeeAlso и модификации классов jaxb, но когда мы генерируем классы JAXB из файла XSD / WSDL, мы не можем их изменить. Таким образом, эти решения не будут работать для этого сценария.

  public static String getStringFromSubscription(Subscription subscription) throws MbException
  {
Marshaller marshaller;
StringWriter stringWriter = new StringWriter();
    try
    {
      marshaller = JAXBContext.newInstance(com.myhealth.com.ObjectFactory.class
            .getPackage().getName()).createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
      marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
marshaller.marshal(subscription, stringWriter);
    }
    catch (Exception e)
    {
      throw new MbException(e);
    }
    return stringWriter;
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вам необходимо указать имя контекста (имя пакета) в экземпляре JAXBContext.newInstance. Он найдет ObjectFactory.class, расположенный в этом пакете, как указано в документации (пункт 1)

JAXBException - если при создании JAXBContext, такой как

  1. ошибка при поиске либо ObjectFactory.class, либо jaxb.index в пакетах
  2. неоднозначность среди глобальных элементов, содержащихся в contextPath
  3. ошибка при поиске значения для свойства поставщика фабрики контекста
  4. смешивание производных от схемы пакетов от разных поставщиков в одном и том же contextPath
public static String getStringFromSubscription(Subscription subscription) throws MbException {
    Marshaller marshaller;
    StringWriter stringWriter = new StringWriter();
    try {
        marshaller = JAXBContext.newInstance("com.myhealth.com").createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
        marshaller.marshal(subscription, stringWriter);
    } catch (Exception e) {
        throw new MbException(e);
    }
    return stringWriter;
}
0 голосов
/ 05 апреля 2019

Насколько мне известно, есть 3 решения.

Класс ObjectFactory создается автоматически при создании jaxb из xsd / wsdl.

  1. Использование метода ObjectFactory для создания необходимого объекта
marshaller.marshal(new com.myhealth.com.ObjectFactory().createSubscription(subscription), stringWriter);
  1. Использование класса непосредственно при создании маршаллера
JAXBContext.newInstance(Subscription.class).createMarshaller();
  1. Другой подход, который уже используется здесь. Я имею в виду использование имени пакета через ObjectFactory
JAXBContext.newInstance(com.myhealth.com.ObjectFactory.class
            .getPackage().getName()).createMarshaller();
...