users@jaxb.java.net

Re: JAXB 2.1 - unmarshal out of context

From: Shannon Scott <sscott_at_mapit.net>
Date: Mon, 10 Sep 2012 08:57:01 -0400

Thank you for your helpful advice.
My problem is resolved.
The most significant change I made was to remove all the named complex
types from my schema.

After that, I was able to use this code snip to identify what type of
object was being unmarshalled:
Object object = _unMarshaller.unmarshal(new StreamSource(new
StringReader(xmlString)));
System.out.println(object.getClass());

Then I modified the that class (from output above) generated by JAXB to
extend my generic class and it works.

Thanks again for all the guidance.



On Fri, Sep 7, 2012 at 8:09 AM, Wolfgang Laun <wolfgang.laun_at_gmail.com>wrote:

> @Iaroslav: Note that the poster's problems are not due to generics. He
> has developed an interface for a generalized call (which he calls
> "generic") to an unmarshaller. Most of this is now (JAXB 2.x) provided
> by JAXBElement.
>
> -W
>
> On 07/09/2012, Iaroslav Savytskyi <iaroslav.savytskyi_at_oracle.com> wrote:
> > Hi, Scott,
> >
> > Definitely it's possible to work with generics in JAXB 2.1.
> >
> > But it's hard to say why do you have the problem without having more
> > info. The common approach to work with generics in JAXB is to use
> > adapters. Here is good example of it
> >
> > http://stackoverflow.com/questions/826736/jaxb-marshalling-and-generics
> >
> > May be it will be helpful for you.
> >
> > --
> > Iaroslav
> >
> >
> > On 05/09/12 19:17, Shannon Scott wrote:
> >> Thank you.
> >> I removed the generateValueClass="false" from my bindings file - so now
> >> JAXB 2.1 does not generate the interfaces.
> >> I changed my generic class used to receive all types of xml during
> >> unmarshalling from an interface to an abstract class:
> >> package xxx.frameworks.interfaces;
> >>
> >> public class GenericXmlInterfaceRecord {
> >>
> >> }
> >>
> >> Now the unmarshaling fails with this error:
> >> unexpected element (uri:"", local:"Unit2Report"). Expected elements are
> >> (none)
> >>
> >> I imagine this is because my generic class does not have the XMLElement
> >> annotation:
> >> @XmlElement(name = " Unit2Report", required = true)
> >> (it is meant to be generic - not just for this set of elements)
> >>
> >> Is it possible to unmarshal to a generic class with JAXB 2.1 (like we
> >> did with JAXB 1.0)?
> >>
> >> Sorry if I missed the point of your suggestion.
> >> Thank you for trying to help.
> >> Shannon
> >>
> >>
> >> On Wed, Sep 5, 2012 at 11:17 AM, Wolfgang Laun <wolfgang.laun_at_gmail.com
> >> <mailto:wolfgang.laun_at_gmail.com>> wrote:
> >>
> >> JAXB 2.0 doesn't handle interfaces. You'll have to provide classes.
> >> -W
> >>
> >>
> >>
> >> On 5 September 2012 16:52, Shannon Scott <sscott_at_mapit.net
> >> <mailto:sscott_at_mapit.net>> wrote:
> >>
> >> I am trying to upgrade from JAXB 1.0 to JAXB 2.1 (in Java 1.6).
> >>
> >> We have a directory where the jaxb generated files are:
> >> xxx.interfaces.unit2.data
> >>
> >> We have a generic class used to receive all types of xml during
> >> unmarshalling:
> >> package xxx.frameworks.interfaces;
> >>
> >> public interface GenericXmlInterfaceRecord {
> >>
> >> }
> >> ## JAXB 1.0 ##
> >> Our JAXBContext and UnMarshaller are intialized like this:
> >> _jaxbContext =
> >> JAXBContext.newInstance("xxx.interfaces.unit2.data");
> >> _unMarshaller = _jaxbContext.createUnmarshaller();
> >> _unMarshaller.setEventHandler(_xmlValidationEventsHandler);
> >> _unMarshaller.setValidating(true);
> >>
> >> Previously we would unmarshal our xml like this:
> >>
> >> GenericXmlInterfaceRecord record =
> >> (GenericXmlInterfaceRecord) _unMarshaller.unmarshal(
> >> new StreamSource(new StringReader(xmlString)));
> >> We would extend our generic class in the generated JAXB class
> >> for the root element (for example):
> >> package xxx.interfaces.unit2.data;
> >>
> >> public interface Unit2ReportType
> >> extends
> >> javax.xml.bind.Element,
> >> xxx.frameworks.interfaces.GenericXmlInterfaceRecord
> >> {
> >>
> >>
> >> ## JAXB 2.1 ##
> >> We are intializing the JAXBContext and UnMarshaller like this:
> >> _jaxbContext =
> >> JAXBContext.newInstance("xxx.interfaces.unit2.data");
> >> _unMarshaller = _jaxbContext.createUnmarshaller();
> >> _unMarshaller.setEventHandler(_xmlValidationEventsHandler);
> >> _unMarshaller.setSchema(schema);
> >>
> >> And we are trying to unmarshal our xml like this:
> >> JAXBElement<GenericXmlInterfaceRecord>
> >> rootElement = _unMarshaller.unmarshal(new StreamSource(
> >> new StringReader(xmlString)),GenericXmlInterfaceRecord.class);
> >>
> >> GenericXmlInterfaceRecord record = rootElement.getValue();
> >>
> >> But this throws an error:
> >> xxx.frameworks.interfaces.GenericXmlInterfaceRecord is not known
> >> to this context
> >>
> >> I think the error is because the GenericXmlInterfaceRecord is
> >> not within the JAXBContext used to create the unmarshaler
> >> ("xxx.interfaces.unit2.data").
> >>
> >> QUESTION:
> >> Is there a way with JAXB 2.1 to unmarshal to a class outside the
> >> directory/package with the JAXB generated files (like we did
> >> with JAXB 1.0)?
> >>
> >> I also tried adding the GenericXmlInterfaceRecord package name
> >> to the JAXBContext initialization, and putting @XmlRootElement
> >> into the GenericXmlInterfaceRecord class, but then I got this
> >> error:
> >> ClassNotFoundException:
> >> xxx.frameworks.interfaces.impl.ObjectFactory
> >>
> >> Any help or advice is greatly appreciated.
> >> Sorry if this is not the appropriate venue for the inquery, feel
> >> free to direct me elsewhere.
> >>
> >> Thank you.
> >> Shannon
> >>
> >>
> >>
> >
>