JAXB unmarshalling не может вернуть элемент, имеющий substitutionGroup - PullRequest
0 голосов
/ 27 июня 2018

При демонтаже XML-документа JAXB не удается демонтировать сложный тип с именем группы подстановки. Документ поставляется с замещающим именем, и процесс демаршалирования JAXB не может связать данные с фактическим элементом. И в конце концов я получаю пустой объект, для которого данные поступают в XML-документе. Это ошибка в JAXB или я что-то здесь не так делаю?

Примечание: приведенная ниже схема четко определяет заменяющее имя для проблемного сложного типа элемента ENBFunction. И нет ошибок при демаршаллинге «xn: ManagedElementOptionallyContainedNrmClass», но данные не заполнены в Java-классе «ENBFunction».

    <element name="ENBFunction" substitutionGroup="xn:ManagedElementOptionallyContainedNrmClass">
    <complexType>
      <complexContent>
        <extension base="xn:NrmClass">
          <sequence>
            <element name="attributes" minOccurs="0">
              <complexType>
                <all>
                  <element name="userLabel" type="string"/>
                  <element name="enbId" type="en:EnbId" minOccurs="0"/>
                  <element name="x2BlackList" type="xn:dnList" minOccurs="0"/>
                  <element name="x2WhiteList" type="xn:dnList" minOccurs="0"/>
                  <element name="x2HOBlackList" type="xn:dnList" minOccurs="0"/>
                  <element name="x2IpAddressList" type="string" minOccurs="0"/>
                  <element name="tceIDMappingInfoList" type="en:TceIDMappingInfoList" minOccurs="0"/>
                  <!-- linkList attribute is to be added when defined in the IS -->
                </all>
              </complexType>
            </element>
            <choice minOccurs="0" maxOccurs="unbounded">
              <element ref="en:EUtranCellFDD"/>
              <element ref="en:EUtranCellTDD"/>
              <element ref="epc:EP_RP_EPS"/>
              <element ref="en:ENBFunctionOptionallyContainedNrmClass"/>
              <element ref="en:DeNBCapability"/>
              <element ref="xn:VsDataContainer"/>
            </choice>
            <choice minOccurs="0" maxOccurs="1">
              <element ref="sp:ESPolicies"/>
            </choice>
            <choice minOccurs="0" maxOccurs="1">
              <element ref="sp:SONControl"/>
            </choice>
            <choice minOccurs="0" maxOccurs="1">
              <element ref="sp:SONTargets"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
  </element>

1 Ответ

0 голосов
/ 28 июня 2018

Основная проблема заключалась в том, как я создавал экземпляр JAXBContext. JAXB предоставляет несколько способов создания экземпляра JAXBContext:

static JAXBContext  newInstance(Class... classesToBeBound) 
       Obtain a new instance of a JAXBContext class.
static JAXBContext  newInstance(Class[] classesToBeBound, Map<String,?> properties) 
       Obtain a new instance of a JAXBContext class.
***static JAXBContext   newInstance(String contextPath) 
       Obtain a new instance of a JAXBContext class.***
static JAXBContext  newInstance(String contextPath, ClassLoader classLoader) 
       Obtain a new instance of a JAXBContext class.
static JAXBContext  newInstance(String contextPath, ClassLoader classLoader, Map<String,?> properties) 
       Obtain a new instance of a JAXBContext class.

Первоначально я использовал первый,

static JAXBContext  newInstance(Class... classesToBeBound) 

, в котором я поставлял все классы jaxb для привязки, что почему-то не работало. Это сработало, когда я использовал третий способ создания объекта, который использует одну строку с именами пакетов, разделенных двоеточиями, где находятся все классы jaxb.

static JAXBContext   newInstance(String contextPath)
...