21

I am using JAXB to unmarshal an XML file into an object tree. The root object is non-null, but all of it's members are null even though there is data in the XML file. My object classes were generated with Axis2 from wsdls. I have the ObjectFactory class, the jaxb.index class, the package.info annotation, etc.

My problem is the same as this discussion: http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

First and foremost: is there a way I can get it to fill the data properly?

If not, is there a good substitute library for either Axis2 or JAXB that does the same thing but that will play nicely with each other?

Amber Shah
  • 752
  • 1
  • 6
  • 15

5 Answers5

59

JAXB by default silently ignores errors. I cannot see any reason why this is the default configuration. Try adding this code to throw an exception if something goes wrong.

unmarshaller.setEventHandler(
    new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent event ) {
            throw new RuntimeException(event.getMessage(),
                                       event.getLinkedException());
        }
});
Jesse Barnum
  • 6,507
  • 6
  • 40
  • 69
  • Great suggestion. I would however caution against considering the JAXB developers as not very good - much of JAXB was written by the genius behind Jenkins, Kohsuke Kawaguchi. Allowing for a pluggable event handler allows for great flexibility (at a cost of simplicity). – JaysonRaymond Aug 13 '12 at 17:24
  • 3
    @JaysonRaymond - You're right, I shouldn't use those words. However, having just discovered that I'd wasted two days of work because JAXB was silently ignoring errors was frustrating, to say the least. I strongly maintain that this should not be the default configuration, but I will edit the wording on my answer. – Jesse Barnum Aug 14 '12 at 12:42
  • 1
    If you use `Jaxb2Marshaller`, it's `unmarshaller.setValidationEventHandler()`. – zut Sep 17 '13 at 14:11
  • 1
    I was wasting a lot of time trying to find whats wrong with my pojos. This finally was the biggest help :) – Gautam Jose Jul 05 '16 at 20:29
  • Another alternative is to use the DefaultValidationHandler: `unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());` – Nicolas Mar 06 '19 at 14:17
1

Recently I had similar kind of issue, and could able to fix it up as below:

1) Fixup the xsd file. In my case I've ensured that all complex elements in xsd refering to their corresponding type using ref attribute, instead of declaring them with type attribute.

I've verified whether my xsd proper or not by creating an xml file from XML Schema file option in Eclipse.

Before the fix, the root element in the xml file was empty. After fixing the xsd the xml was got created properly with some sample values.

2) clean and re-build It's mandatory to clean before re-generating the classes.

Srinivas
  • 11
  • 1
0

The package-info.java file must be compiled. Eclipse must find all .java files and compile them. If compiling from the command line, and letting javac search for dependencies, it will NOT find it. Then when you run you'll get empty objects. Seems like a bug in JAXB to not at least import that file somewhere. And the error should tell you to possible compile that file.

Jeff
  • 9
  • 1
0

Just want to add that when Axis2 is used together with Rampart (SOAP Body encryption) and JAXB, this issue occurs always.

See for details: AXIS2-4981

rustyx
  • 80,671
  • 25
  • 200
  • 267
0

I came across this issue when the xsd files that were used to create the Java code had references to unreachable urls.

Luckily all of these references appeared in the package-info.java files so I eventually had to add an antRun task after the xjc task that deleted them.

OldCurmudgeon
  • 64,482
  • 16
  • 119
  • 213