首页 文章

尝试编组缺少@XmlRootElement的JAXB根对象时出错

提问于
浏览
9

我有一个复杂的xml架构,它是国际标准的一部分,因此我无法更改架构文件,并且我已经使用Maven从它们生成JAXB对象 . 当我尝试将数据设置到我的JAXB对象中然后封送根元素时,我在几个复杂类型上得到了丢失的@XmlRootElement错误 . 我的问题是如何解决这个问题?环境:

  • JAXB 2.2.2

  • Maven 3.0.3

  • Eclipse Juno

  • Java 1.6

  • Windows 7 64位

我已经广泛研究了网站和这个网站但是没有找到我的问题的答案,包括这篇文章:http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

这个关于堆栈溢出的问题:JAX-WS MarshalException with custom JAX-B bindings: Unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation

我已经尝试在我的自定义绑定文件中为违规类添加注释,但它将注释添加到类以及getContent()方法中,并且我认为我应该必须添加此注释,因为这样是一个复杂类型,它是根的一个组件,实际上它嵌套在树中相当深的位置 . 我已经读过你可以将 <xjc:simple/> 标签添加到全局绑定元素,但是我已经向全局绑定元素添加了许多属性,当我这样做时它不会编译 .

有人可以帮我指出正确的方向,这可能是我构建JAXB对象的方式错误吗?我已经在调试器中完成了它,似乎当com.sun.xml.bind.v2.runtime.property包中的ArrayReferenceNodeProperty类尝试序列化列表主体并且当它获取这些类的JaxBeanInfo时,似乎没有dom处理程序集和jaxbType不是一个对象,因此它认为它需要是一个根 .

我没有在基于Web的服务中使用它,除了绑定文件中的调整以解决命名冲突没有创建任何自定义类或绑定 .

这是顶级架构文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified">
<xs:annotation>
    <xs:documentation>
        *****************************************************************************
        *                                                                           *
        *                        S1000D Issue 3                                     *
        *                          XML Schema                                       *
        *                                                                           *
        *                     Release Version 3.0                                   *
        *                       Date: 2007-07-31                                    *
        *                                                                           *
        *                                                                           *
        * The following attribute definition on the root element may be used to     *
        * call this set of declarations:-                                           *
        *                                                                           *
        * xsi:noNamespaceSchemaLocation=                                            *
        * "http://www.s1000d.org/S1000D_3-0/xml_schema_master/dm/procedSchema.xsd"  *
        *****************************************************************************
    </xs:documentation>
</xs:annotation>
<xs:redefine schemaLocation="elementGroups.xsd">
    <xs:group name="APPLIC">
        <xs:choice>
            <xs:sequence>
                <xs:element ref="displaytext"/> 
                <xs:choice minOccurs="0">
                    <xs:element ref="assert"/>
                    <xs:element ref="evaluate"/>
                </xs:choice>
            </xs:sequence>
            <xs:choice>
                <xs:element ref="assert"/>
                <xs:element ref="evaluate"/>
            </xs:choice>
        </xs:choice>
    </xs:group>
    <xs:group name="NPAR">
        <xs:sequence>
            <xs:group ref="WC"/>
            <xs:group ref="NPFFT" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="NPFFT">
        <xs:choice>
            <xs:group ref="NP"/>
            <xs:group ref="FFT"/>
        </xs:choice>
    </xs:group>
    <xs:group name="paracon">
        <xs:choice>
            <xs:group ref="text"/>
            <xs:group ref="list"/>
        </xs:choice>
    </xs:group>
    <xs:group name="text">
        <xs:choice>
            <xs:element ref="ein"/>
            <xs:element ref="cb"/>
            <xs:element ref="parasigdata"/>
            <xs:element ref="quantity"/>
            <xs:element ref="xref"/>
            <xs:element ref="indxflag"/>
            <xs:element ref="change"/>
            <xs:element ref="emphasis"/>
            <xs:element ref="symbol"/>
            <xs:element ref="subscrpt"/>
            <xs:element ref="supscrpt"/>
            <xs:element ref="refdm"/>
            <xs:element ref="reftp"/>
            <xs:element ref="ftnote"/>
            <xs:element ref="ftnref"/>
            <xs:element ref="acronym"/>
            <xs:element ref="acroterm"/>
            <xs:element ref="capgrp"/>
        </xs:choice>
    </xs:group>
    <xs:group name="TEXT-NOREFS">
        <xs:choice>
            <xs:element ref="xref"/>
            <xs:element ref="indxflag"/>
            <xs:element ref="symbol"/>
            <xs:element ref="subscrpt"/>
            <xs:element ref="supscrpt"/>
            <xs:element ref="ftnref"/>
            <xs:element ref="acronym"/>
            <xs:element ref="acroterm"/>
        </xs:choice>
    </xs:group>
    <xs:group name="STEP1">
        <xs:sequence>
            <xs:element ref="step1"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP2">
        <xs:sequence>
            <xs:element ref="step2"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP3">
        <xs:sequence>
            <xs:element ref="step3"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP4">
        <xs:sequence>
            <xs:element ref="step4"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP5">
        <xs:sequence>
            <xs:element ref="step5"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP6">
        <xs:sequence>
            <xs:element ref="step6"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP7">
        <xs:sequence>
            <xs:element ref="step7"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="STEP8">
        <xs:sequence>
            <xs:element ref="step8"/>
        </xs:sequence>
    </xs:group>
</xs:redefine>
<xs:redefine schemaLocation="complexTypes.xsd">
    <xs:complexType name="contentType">
        <xs:complexContent>
            <xs:restriction base="contentType">
                <xs:sequence>
                    <xs:element ref="refs" minOccurs="0"/>
                    <xs:element ref="proced"/>
                </xs:sequence>
                <xs:attribute ref="id"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
</xs:redefine>
<xs:element name="dmodule" type="dmoduleType"/>

对于xrefType,我只设置两个属性,对于refdmType,我只设置另一个属于ALLDMC组的复杂类型 . 错误的两种复杂类型的代码是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" elementFormDefault="qualified" attributeFormDefault="qualified">
    <xs:import namespace="http://www.w3.org/1999/02/22-rdf-syntax-ns#" schemaLocation="rdf.xsd"/>
    <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/>
    <xs:include schemaLocation="attributeGroups.xsd"/>
    <xs:include schemaLocation="simpleElements.xsd"/>
    <xs:include schemaLocation="complexElements.xsd"/>
    <xs:include schemaLocation="elementGroups.xsd"/>
    <xs:complexType name="refdmType">
        <xs:choice>
            <xs:sequence>
                <xs:element ref="applic" minOccurs="0"/>
                <xs:element ref="dmcextension" minOccurs="0"/>
                <xs:group ref="ALLDMC"/>
                <xs:element ref="issno" minOccurs="0"/>
                <xs:element ref="dmtitle" minOccurs="0"/>
                <xs:element ref="language" minOccurs="0"/>
            </xs:sequence>
            <xs:group ref="xlink:XLINKEXT" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        <xs:attribute ref="target"/>
        <xs:attribute ref="refapplic"/>
        <xs:attributeGroup ref="bodyatt"/>
        <xs:attributeGroup ref="cntlcontent"/>
        <xs:attributeGroup ref="xlink:XLINKATT"/>
    </xs:complexType>
    <xs:complexType name="xrefType" mixed="true">
        <xs:sequence>
            <xs:element ref="applic" minOccurs="0"/>
            <xs:group ref="SPARCON" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute ref="xrefid"/>
        <xs:attribute ref="xidtype"/>
        <xs:attribute ref="target"/>
        <xs:attribute ref="destitle"/>
        <xs:attribute ref="pretext"/>
        <xs:attribute ref="posttext"/>
        <xs:attribute ref="refapplic"/>
        <xs:attributeGroup ref="cntlcontent"/>
        <xs:attributeGroup ref="xlink:XLINKATT3"/>
    </xs:complexType>
    </xs:schema>

这是JAXB生成的类的主要部分 . 我删除了大多数getter和setter以节省空间:RefdmType:

/**
 * <p>Java class for refdmType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="refdmType">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;choice>
 *         &lt;sequence>
 *           &lt;element ref="{}applic" minOccurs="0"/>
 *           &lt;element ref="{}dmcextension" minOccurs="0"/>
 *           &lt;group ref="{}ALLDMC"/>
 *           &lt;element ref="{}issno" minOccurs="0"/>
 *           &lt;element ref="{}dmtitle" minOccurs="0"/>
 *           &lt;element ref="{}language" minOccurs="0"/>
 *         &lt;/sequence>
 *         &lt;group ref="{http://www.w3.org/1999/xlink}XLINKEXT" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/choice>
 *       &lt;attGroup ref="{http://www.w3.org/1999/xlink}XLINKATT"/>
 *       &lt;attGroup ref="{}cntlcontent"/>
 *       &lt;attGroup ref="{}bodyatt"/>
 *       &lt;attribute ref="{}target"/>
 *       &lt;attribute ref="{}refapplic"/>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "refdmType", propOrder = {
    "applicAndDmcextensionAndAge"
})
public class RefdmType implements Serializable
{

    private final static long serialVersionUID = 1L;
    @XmlElements({
        @XmlElement(name = "applic", type = ApplicType.class),
        @XmlElement(name = "dmcextension", type = DmcextensionType.class),
        @XmlElement(name = "age", type = AgeType.class),
        @XmlElement(name = "avee", type = AveeType.class),
        @XmlElement(name = "issno", type = IssnoType.class),
        @XmlElement(name = "dmtitle", type = DmtitleType.class),
        @XmlElement(name = "language", type = LanguageType.class),
        @XmlElement(name = "resource", namespace = "http://www.w3.org/1999/xlink", type = Resource.class),
        @XmlElement(name = "locator", namespace = "http://www.w3.org/1999/xlink", type = Locator.class),
        @XmlElement(name = "arc", namespace = "http://www.w3.org/1999/xlink", type = Arc.class)
    })
    protected List<Serializable> applicAndDmcextensionAndAge;
    @XmlAttribute(name = "target")
    protected String target;
    @XmlAttribute(name = "refapplic")
    @XmlIDREF
    @XmlSchemaType(name = "IDREF")
    protected Object refapplic;
    @XmlAttribute(name = "type", namespace = "http://www.w3.org/1999/xlink")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String type;
    @XmlAttribute(name = "href", namespace = "http://www.w3.org/1999/xlink")
    protected String href;
    @XmlAttribute(name = "title", namespace = "http://www.w3.org/1999/xlink")
    protected String title;
    @XmlAttribute(name = "show", namespace = "http://www.w3.org/1999/xlink")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String show;
    @XmlAttribute(name = "actuate", namespace = "http://www.w3.org/1999/xlink")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String actuate;
    @XmlAttribute(name = "authname")
    protected String authname;
    @XmlAttribute(name = "authdoc")
    protected String authdoc;
    @XmlAttribute(name = "id")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String id;
    @XmlAttribute(name = "level")
    @XmlSchemaType(name = "nonNegativeInteger")
    protected BigInteger level;
    @XmlAttribute(name = "mark")
    @XmlSchemaType(name = "nonNegativeInteger")
    protected BigInteger mark;
    @XmlAttribute(name = "change")
    protected ChangeType change;
    @XmlAttribute(name = "rfc")
    protected String rfc;

    /**
     * Gets the value of the applicAndDmcextensionAndAge property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the applicAndDmcextensionAndAge property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getApplicAndDmcextensionAndAge().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ApplicType }
     * {@link DmcextensionType }
     * {@link AgeType }
     * {@link AveeType }
     * {@link IssnoType }
     * {@link DmtitleType }
     * {@link LanguageType }
     * {@link Resource }
     * {@link Locator }
     * {@link Arc }
     * 
     * 
     */
    public List<Serializable> getApplicAndDmcextensionAndAge() {
        if (applicAndDmcextensionAndAge == null) {
            applicAndDmcextensionAndAge = new ArrayList<Serializable>();
        }
        return this.applicAndDmcextensionAndAge;
    }
    }

XrefType:

/**
 * <p>Java class for xrefType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within    this class.
 * 
 * <pre>
 * &lt;complexType name="xrefType">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}applic" minOccurs="0"/>
 *         &lt;group ref="{}SPARCON" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *       &lt;attGroup ref="{}cntlcontent"/>
 *       &lt;attGroup ref="{http://www.w3.org/1999/xlink}XLINKATT3"/>
 *       &lt;attribute ref="{}xrefid"/>
 *       &lt;attribute ref="{}xidtype"/>
 *       &lt;attribute ref="{}target"/>
 *       &lt;attribute ref="{}destitle"/>
 *       &lt;attribute ref="{}pretext"/>
 *       &lt;attribute ref="{}posttext"/>
 *       &lt;attribute ref="{}refapplic"/>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "xrefType", propOrder = {
"content"
})
public class XrefType implements Serializable
{

    private final static long serialVersionUID = 1L;
    @XmlElementRefs({
      @XmlElementRef(name = "supscrpt", type = JAXBElement.class),
      @XmlElementRef(name = "subscrpt", type = JAXBElement.class),
      @XmlElementRef(name = "applic", type = JAXBElement.class)
    })
   @XmlMixed
   protected List<Serializable> content;
   @XmlAttribute(name = "xrefid")
   @XmlJavaTypeAdapter(Adapter5 .class)
   @XmlSchemaType(name = "IDREF")
   protected String xrefid;
   @XmlAttribute(name = "xidtype")
   protected XidtypeType xidtype;
   @XmlAttribute(name = "target")
   protected String target;
   @XmlAttribute(name = "destitle")
   protected String destitle;
   @XmlAttribute(name = "pretext")
   protected String pretext;
   @XmlAttribute(name = "posttext")
   protected String posttext;
   @XmlAttribute(name = "refapplic")
   @XmlIDREF
   @XmlSchemaType(name = "IDREF")
   protected Object refapplic;
   @XmlAttribute(name = "authname")
   protected String authname;
   @XmlAttribute(name = "authdoc")
   protected String authdoc;
   @XmlAttribute(name = "type", namespace = "http://www.w3.org/1999/xlink")
   @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
   protected String type;
   @XmlAttribute(name = "href", namespace = "http://www.w3.org/1999/xlink")
   protected String href;
   @XmlAttribute(name = "title", namespace = "http://www.w3.org/1999/xlink")
   protected String title;
   @XmlAttribute(name = "show", namespace = "http://www.w3.org/1999/xlink")
   @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
   protected String show;
   @XmlAttribute(name = "actuate", namespace = "http://www.w3.org/1999/xlink")
   @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
   protected String actuate;

   /**
    * Gets the value of the content property.
    * <p>
    * This accessor method returns a reference to the live list,
    * not a snapshot. Therefore any modification you make to the
    * returned list will be present inside the JAXB object.
    * This is why there is not a <CODE>set</CODE> method for the content property.
    * 
    * <p>
    * For example, to add a new item, do as follows:
    * <pre>
    *    getContent().add(newItem);
    * </pre>
    * 
    * 
    * <p>
    * Objects of the following type(s) are allowed in the list
    * {@link String }
    * {@link JAXBElement }{@code <}{@link String }{@code >}
    * {@link JAXBElement }{@code <}{@link ApplicType }{@code >}
    * {@link JAXBElement }{@code <}{@link String }{@code >}
    * 
    * 
    */
    public List<Serializable> getContent() {
       if (content == null) {
        content = new ArrayList<Serializable>();
       }
       return this.content;
    }
}

最后这是我的自定义绑定文件:

<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:annox="http://annox.dev.java.net"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">

    <jxb:globalBindings typesafeEnumMemberName="generateName"
        typesafeEnumMaxMembers="1500" collectionType="java.util.ArrayList"
        generateValueClass="true" choiceContentProperty="true">
        <xjc:serializable uid="1" />
    </jxb:globalBindings>

    <jxb:bindings schemaLocation="simpleTypes.xsd" node="/xs:schema">
        <jxb:bindings node="//xs:simpleType[@name='YEAR']">
            <jxb:javaType name="java.lang.Integer" />
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='DAY']">
            <jxb:javaType name="java.lang.String" />
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='MONTH']">
            <jxb:javaType name="java.lang.String" />
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='issnovalueType']">
            <jxb:javaType name="java.lang.String" />
        </jxb:bindings>
    </jxb:bindings>

    <jxb:bindings schemaLocation="attributes.xsd" node="/xs:schema">
        <jxb:bindings node="xs:attribute[@name='inwork']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType name="java.lang.String" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
        <jxb:bindings node="//xs:attribute[@name='xrefid']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType name="java.lang.String" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
    </jxb:bindings>

    <jxb:bindings schemaLocation="complexTypes.xsd" node="/xs:schema">
        <jxb:bindings node="xs:complexType[@name='dmoduleType']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                    name="dmodule" />
            </annox:annotate>
        </jxb:bindings>
        <jxb:bindings node="//xs:complexType[@name='skillType']">
            <jxb:class name="SkillTypeComplex" />
        </jxb:bindings>
        <!--<jxb:bindings node="//xs:complexType[@name='xrefType']">
              <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                    name="xref" />
            </annox:annotate>
            <jxb:bindings node=".//xs:sequence//xs:element[@ref='applic']">
                <jxb:property name="xrefApplic"/>
            </jxb:bindings>
        </jxb:bindings>-->
    </jxb:bindings>

    <jxb:bindings schemaLocation="elementGroups.xsd" node="//xs:group[@name='APPLIC']">
        <jxb:bindings node=".//xs:choice//xs:sequence">
            <jxb:bindings node=".//xs:choice">
                <jxb:property name="assertEvalChoice" />
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>

    <jxb:bindings schemaLocation="dc.xsd" node="/xs:schema">
        <jxb:bindings node="//xs:element[@name='language']">
            <jxb:class name="DcLanguage" />
        </jxb:bindings>
        <jxb:bindings node="//xs:element[@name='subject']">
            <jxb:class name="DcSubject" />
        </jxb:bindings>
        <jxb:bindings node="//xs:element[@name='title']">
            <jxb:class name="DcTitle" />
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

高度了解为什么会出现这种情况以及如何解决这个问题的建议将不胜感激 . 我只使用JAXB几个月而且不是专家 . 谢谢 .

这是我看到的错误:

javax.xml.bind.MarshalException - 包含链接异常:[com.sun.istack.SAXException2:无法封送类型“com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType”作为元素,因为它缺失com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)中的一个@XmlRootElement注释,位于com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:249) )在com.synesis7.s7exporter的com.synesis7.s7edportr.client.s1000d.procedural.S7ProceduralRunnable.writeToXml(S7ProceduralRunnable.java:142)的javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)中 . 客户端.1000d.procedural.S7ProceduralRunnable.createProceduralDm(S7ProceduralRunnable.java:118)at com.synesis7.s7edport.lient.sunedable.run(S7ProceduralRunnable.java:93)at com.synesis7.s7exporter.S7ExporterController.processProceduralDms( S7ExporterController.java:235)在com.synesis7.s7exporter.S7ExporterController.exportSchema(S7Exporter) Controller.java:118)com.synesis7.s7exporter.S7exporter.initializeExporter(S7exporter.java:58)at com.synesis7.s7exporter.S7exporter.main(S7exporter.java:38)引起:com.sun.istack.SAXException2 :无法封送类型“com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType”作为元素,因为它在com.sun.xml.bind.v2.runtime.XMLSerializer.reportError中缺少@XmlRootElement注释( XMLSerializer.java:252)位于com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:324)的com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty . java:118)at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java: 344)在Com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:700)位于com的com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) . sun.com.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)at com . sun.com.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:344)位于com.sun.xml的com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:700) . com.sun.xml中的com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)中的bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) . 在com.sun.xml的com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:344)中的bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) . 在com.sun.xml.bind的com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69)中的bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:700) . v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)位于com.sun.xml.bind的com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) . v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:344)位于com.sun.xml.bind.v2.runtime的com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:700) . property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:156)at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:344)at com.sun.xml.bind.v2.runtime.XMLSerializer . childAsXsiType(XMLSerializer.java:700)位于com.sun.xml.bind.v2.runtime的com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:156) .classBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:344)at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:338)at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:156)at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl) .java:344)com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:700)at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java) :156)at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody(ElementBeanInfoImpl.java:161)at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody(ElementBeanInfoImpl.java:193 )com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:321)at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(Ele mentBeanInfoImpl.java:328)com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76)at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java: 498)at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:320)... 9更多

2 回答

  • 19

    您可以将对象包装在 JAXBElement 的实例中以提供根元素信息 . 如果您从XML模式生成模型,则在生成的 ObjectFactory 类上有方便的方法 .

    For More Information

  • 0

    您可以使用 ObjectFactory 类来解决没有 @XmlRootElement 的类 . ObjectFactory有重载方法将它包装在JAXBElement周围 . Method:1 执行对象的简单创建, Method:2 将使用 @JAXBElement 包装对象 . 始终使用 Method:2 来避免javax.xml.bind.MarshalException - 链接异常缺少@XmlRootElement注释

    Method:1

    public GetCountry createGetCountry() {
            return new GetCountry();
        }
    

    Method:2

    @XmlElementDecl(namespace = "my/name/space", name = "getCountry")
     public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
            return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
        }
    

    希望这会有所帮助......

相关问题