Ошибка сортировки: javax.xml.bind.JAXBException: ни класс, ни какой-либо из его суперклассов не известен в этом контексте

Пока я упорядочивал объект, я получил это исключение: 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;
}

person naqib83    schedule 05.04.2019    source источник


Ответы (2)


Вам нужно указать имя контекста (он же имя пакета) в экземпляре 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;
}
person Misantorp    schedule 05.04.2019

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

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

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