Search code examples
javajacksonjackson-dataformat-xml

Cannot parse XML using Jackson, model never gets populated


I am trying to parse bellow xml using Jackson library but with no luck. I tried few things with my model, and I don't see the problem...

XML:

<?xml version="1.0" encoding="UTF-8"?>
<litre version="1.1" creator="Dummy Creator"  
    xsi:schemaLocation="http://www.dummy.com/xmlschemas/DummyExtension.xsd>
    <metadata>
        <link href="dummy.com">
            <text>Dummy</text>
        </link>
        <time>2012-10-24T23:22:51.000Z</time>
    </metadata>
    <krt>
        <name>Untitled</name>
        <geskrt>
            <pkrt data1="123" data2="321">
                <ints>100</ints>
                <time>2012-10-24T22:21:15.000Z</time>
                <extensions>
                    <axtpx:DummyExtension>
                        <xtpx:hor>40000</xtpx:hor>
                    </axtpx:DummyExtension>
                </extensions>
            </pkrt>
            <pkrt data1="543" data2="345">
                <ints>100</ints>
                <time>2012-10-24T23:29:40.000Z</time>
                <extensions>
                    <axtpx:DummyExtension>
                        <xtpx:hor>50000</xtpx:hor>
                    </axtpx:DummyExtension>
                </extensions>
            </pkrt>
        </geskrt>
    </krt>
</litre>

POJO:

@JacksonXmlRootElement(localName = "litre")
public @Data class Model {

    @JacksonXmlProperty(localName = "pkrt")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Data> entries;

    public static @Data class Data {
        @JacksonXmlProperty(isAttribute = true, localName = "data1")
        private double dataOne;
        @JacksonXmlProperty(isAttribute = true, localName = "data2")
        private double dataTwo;
        @JacksonXmlProperty(localName = "ints")
        private double inters;
        private String time;
        @JacksonXmlProperty(namespace = "xtpx:hor")
        private long hours;
    }
}

While trying to deserialize with:

Model model = mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                    .readValue(filePath.toFile(), Model.class);

parsing always passes with no exception, but entries list is always empty...

I would appreciate any help, thanx!


Solution

  • You most certainly have to do something like this:

    @JacksonXmlRootElement(localName = "litre")
    public @Data class Litre {
    
        @JacksonXmlProperty(localName = "krt")
        private Krt krt;
    
        public static @Data class Krt {
    
            @JacksonXmlProperty(localName = "geskrt")
            private Geskrt geskrt;
        }
    
        public static @Data class Geskrt {
    
            @JacksonXmlProperty(localName = "pkrt")
            @JacksonXmlElementWrapper(useWrapping = false)
            private List<Pkrt> pkrt;
        }
    
        public static @Data class Pkrt {
    
            @JacksonXmlProperty(isAttribute = true, localName = "data1")
            private double dataOne;
    
            @JacksonXmlProperty(isAttribute = true, localName = "data2")
            private double dataTwo;
    
            @JacksonXmlProperty(localName = "ints")
            private double inters;
    
            private String time;
    
            @JacksonXmlProperty(namespace = "xtpx:hor")
            private long hours;
        }
    }