JAXB解组无法返回具有替换组的元素

时间:2018-06-27 05:35:03

标签: jaxb unmarshalling substitution

在解组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 :(得分:0)

主要问题在于我创建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)