Unmarshalexception意外元素,预期元素是(无)

时间:2015-03-24 09:43:41

标签: java xml jaxb

当我想要从字节数组中序列化的JAXBElement deserialaze时,我遇到了问题。我有例外:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Avizo"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)

这是我的代码:

public class JAXBTest {

    public static byte[] serialize(JAXBElement<AvizoType> xmlData) throws Exception {
        // Result stream buffer
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        final JAXBContext jaxbContext = JAXBContext.newInstance(AvizoType.class);

        final Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(xmlData, new StreamResult(bos));

        return bos.toByteArray();
    }

    public static JAXBElement<AvizoType> deserialize(byte[] data) throws Exception {
        // Result stream buffer
        ByteArrayInputStream bis = new ByteArrayInputStream(data);

        final JAXBContext jaxbContext = JAXBContext.newInstance(AvizoType.class);

        final Unmarshaller marshaller = jaxbContext.createUnmarshaller();

        return (JAXBElement<AvizoType>) marshaller.unmarshal(bis);
    }

    public static void main(String[] args) throws Exception {
        AvizoType type = new AvizoType();
        type.setAvizoId(1);

        JAXBElement<AvizoType> element = new JAXBElement(new QName("Avizo"), AvizoType.class, type);

        byte[] result = serialize(element);
        deserialize(result);

    }
}

avizoType是从xsd:

生成的类
    //
    // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.10-b140310.1920 
    // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
    // Any modifications to this file will be lost upon recompilation of the source schema. 
    // Generated on: 2015.03.23 at 01:59:39 PM CET 
    //


    import java.io.Serializable;

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;

    /**
     * <p>
     * Java class for AvizoType complex type.
     * 
     * <p>
     * The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType name="AvizoType">
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="AvizoId" type="{http://www.w3.org/2001/XMLSchema}long"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AvizoType", propOrder = { "avizoId" })
public class AvizoType implements Serializable {

    @XmlElement(name = "AvizoId")
    protected long avizoId;

    /**
     * Gets the value of the avizoId property.
     * 
     */
    public long getAvizoId() {
        return avizoId;
    }

    /**
     * Sets the value of the avizoId property.
     * 
     */
    public void setAvizoId(long value) {
        this.avizoId = value;
    }

}

2 个答案:

答案 0 :(得分:2)

您的班级ObjectFactory旁边应该有一个名为AvizoType的班级。如果是这样,那么尝试这种方法:

final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
return ((JAXBElement<AvizoType>) jaxbContext.createUnmarshaller().unmarshal(
                inputStream)).getValue();

答案 1 :(得分:1)

元素可以与具有@XmlRootElement@XmlElementDecl注释的类相关联。如果是后者,则需要确保生成的ObjectFactory是用于引导JAXBContext的类的一部分。对于从XML Schema生成的模型,您应该在生成的包名称或JAXBContext类上创建ObjectFactory

相关问题