0

EDIT #1: I used JAXB RI 2.2.6 (latest as of today 12/06/12), and I observe the same behavior :-(

I am using JAXB for unmarshalling XML payloads. When I pass an invalid payload for the first time via Unmarshaller, I get the following type of error:

    javax.xml.bind.UnmarshalException: Unable to create an instance of foo.bar.FooBarType
 - with linked exception:
[java.lang.InstantiationException]

On the next line in my code (in the catch() block), I try the same Unmarshaller instance and give a valid payload, where I get following type of error:

java.lang.ClassCastException: foo.bar.SomeAType cannot be cast to foo.bar.SomeBType

On the next line (again in the subsequent catch()), I try the same Unmarshaller instance and again give the same valid payload, which unmarshals fine!

Has anyone experienced this kind of behavior with JAXB? Am I hitting a bug here? Where to look/dig?

Here are the details of the manifest of JAXB jar that I am using:

Manifest-Version: 1.0
 Ant-Version: Apache Ant 1.7.0
 Created-By: 1.5.0_12-b04 (Sun Microsystems Inc.)
 Specification-Title: Java Architecture for XML Binding
 Specification-Version: 2.1
 Specification-Vendor: Sun Microsystems, Inc.
 Implementation-Title: JAXB Reference Implementation 
 Implementation-Version: 2.1.12
 Implementation-Vendor: Sun Microsystems, Inc.
 Implementation-Vendor-Id: com.sun
 Extension-Name: com.sun.xml.bind
 Build-Id: hudson-jaxb-ri-2.1-833
 Class-Path: jaxb-api.jar activation.jar jsr173_1.0_api.jar jaxb1-impl.jar
 Name: com.sun.xml.bind.v2.runtime
 Implementation-Version: hudson-jaxb-ri-2.1-833

Thank you much in advance!

EDIT #2: It's not possible to paste everything, but here's the gist of what it is looking like:

final JAXBContext jaxbContext = JAXBContext.newInstance(FooRequestType.class);
        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        JAXBElement<FooRequestType> result = null;
        try {

            //try unmarshalling invalid payload.
            result = unmarshaller.unmarshal(invalidPayload.getDocumentElement(), FooRequestType.class);

        }catch(Exception e1){

            try {
                //now try unmarshalling valid payload . ##NOTE: If you try unmarshalling Invalid Payload here, it will fail again.
                result = unmarshaller.unmarshal(validPayload.getDocumentElement(), FooRequestType.class);

            } catch(Exception e2){

                //try again unmarshalling valid payload
                result = unmarshaller.unmarshal(validPayload.getDocumentElement(), FooRequestType.class);
                System.out.println("Result:=" + result.getValue());
                System.out.println("Successfully unmarshalled. Exiting with (0)");
                System.exit(0);
            }
        }
        System.out.println("Not expecting to reach here.Exiting with (1)");
        System.exit(1);

EDIT #3: Ran the same piece of code by using EclipseLink MOXy as the JAXB Impl; and it behaves correctly. I opened a bug on Sun/Oracle JAXB RI: http://java.net/jira/browse/JAXB-931

Anand
  • 409
  • 3
  • 7
  • 15

0 Answers0