Reputation: 16525
I have problem when I want to deserialaze JAXBElement which I already serialized from byte array. I got exception:
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)
here is my code:
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 is generated class from 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>
* <complexType name="AvizoType">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="AvizoId" type="{http://www.w3.org/2001/XMLSchema}long"/>
* </sequence>
* </restriction>
* </complexContent>
* </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;
}
}
Upvotes: 6
Views: 14566
Reputation: 6474
You should have a class named ObjectFactory
beside your class AvizoType
. If so then try this approach:
final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
return ((JAXBElement<AvizoType>) jaxbContext.createUnmarshaller().unmarshal(
inputStream)).getValue();
Upvotes: 7
Reputation: 148977
A element can either be associated with a class with an @XmlRootElement
or @XmlElementDecl
annotation. If it's the latter you need to ensure the generated ObjectFactory
is part of the classes used to bootstrap the JAXBContext
. For models generated from an XML Schema you should create the JAXBContext
on the generated package name(s) or ObjectFactory
classes.
Upvotes: 2