toadead
toadead

Reputation: 1098

JAXB Unmarshals Nested Element to Null

XML snippet:

<datasource formatted-name="blah" inline="blah">
    <repository-location derived-from="blah" id="blah" path="blah" revision="blah" site="blah"/>
</datasource>

I am trying to unmarshal everything under one class (DataSource) with nested static classes. Here is my DataSource class:

@XmlRootElement(name = "datasource")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataSource {

    @XmlAttribute(name = "formatted-name")
    protected String formattedName;
    @XmlAttribute(name = "inline")
    protected String inline;
    @XmlElement(name = "repository-location")
    protected RepositoryLocation repositoryLocation;

    // public getters and setters for fields above

    @XmlAccessorType(XmlAccessType.FIELD)
    public static class RepositoryLocation {

        @XmlAttribute(name = "derived-from")
        protected String derivedFrom;
        @XmlAttribute(name = "id")
        protected String id;
        @XmlAttribute(name = "path")
        protected String path;
        @XmlAttribute(name = "revision")
        protected String revision;
        @XmlAttribute(name = "site")
        protected String site;

        // public getters and setters for fields above
    }
}

Unmarshaller:

JAXBContext jaxbContext = JAXBContext.newInstance(DataSource.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(responseXML);
dataSourceResponse = (DataSource) unmarshaller.unmarshal(reader);

I can successfully output DataSource fields "formattedName" and "inline", but "repositoryLocation" is null. Can someone help please?

Upvotes: 9

Views: 2014

Answers (3)

gladiator
gladiator

Reputation: 1363

Tried with java 1.7 too and it works and in xml.txt ,xml is saved

package testSingleJar.specificpackage;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args ) throws Exception
    {
        JAXBContext jaxbContext = JAXBContext.newInstance(DataSource.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        String responseXML =  "";
        //filename is filepath string
        BufferedReader br = new BufferedReader(new FileReader(new File("D:\\xml.txt")));
        String line;
        StringBuilder sb = new StringBuilder();

        while((line=br.readLine())!= null){
            sb.append(line.trim());
        }

        responseXML=sb.toString();
        StringReader reader = new StringReader(responseXML);
        DataSource dataSourceResponse = (DataSource) unmarshaller.unmarshal(reader);
        System.out.println(dataSourceResponse.getRepositoryLocation().getDerivedFrom());
    }
}


@XmlRootElement(name = "datasource")
@XmlAccessorType(XmlAccessType.FIELD)
class DataSource {

    @XmlAttribute(name = "formatted-name")
    protected String formattedName;
    @XmlAttribute(name = "inline")
    protected String inline;
    @XmlElement(name = "repository-location")
    protected RepositoryLocation repositoryLocation;

    // public getters and setters for fields above

    @XmlAccessorType(XmlAccessType.FIELD)
    public static class RepositoryLocation {

        @XmlAttribute(name = "derived-from")
        protected String derivedFrom;
        @XmlAttribute(name = "id")
        protected String id;
        @XmlAttribute(name = "path")
        protected String path;
        @XmlAttribute(name = "revision")
        protected String revision;
        @XmlAttribute(name = "site")
        protected String site;
        public String getDerivedFrom() {
            return derivedFrom;
        }
        public void setDerivedFrom(String derivedFrom) {
            this.derivedFrom = derivedFrom;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getPath() {
            return path;
        }
        public void setPath(String path) {
            this.path = path;
        }
        public String getRevision() {
            return revision;
        }
        public void setRevision(String revision) {
            this.revision = revision;
        }
        public String getSite() {
            return site;
        }
        public void setSite(String site) {
            this.site = site;
        }

    }

    public String getFormattedName() {
        return formattedName;
    }

    public void setFormattedName(String formattedName) {
        this.formattedName = formattedName;
    }

    public String getInline() {
        return inline;
    }

    public void setInline(String inline) {
        this.inline = inline;
    }

    public RepositoryLocation getRepositoryLocation() {
        return repositoryLocation;
    }

    public void setRepositoryLocation(RepositoryLocation repositoryLocation) {
        this.repositoryLocation = repositoryLocation;
    }
}

output : blah

Upvotes: 2

toadead
toadead

Reputation: 1098

Problem solved! I noticed my java 1.7 library is missing some jars. So I decided to go ahead upgrade to 1.8. It worked like magic!

Upvotes: 2

ldz
ldz

Reputation: 2215

JAXB is able to unmarshal without Getters/Setters and fields can even be private. Given the DataSource class above, having some generated toString method added to both DataSource and RepositoryLocation, the following prints out all properties:

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import java.io.StringReader;

public class Jaxb {

    public static void main(String[] args) throws JAXBException {
        String xml = "<datasource formatted-name=\"blah\" inline=\"blah\">\n" +
                "    <repository-location derived-from=\"blah\" id=\"blah\"" +
                " path=\"blah\" revision=\"blah\" site=\"blah\"/>\n" +
                "</datasource>";

        JAXBContext context = JAXBContext.newInstance(DataSource.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        DataSource dataSource = (DataSource) unmarshaller.unmarshal(new StringReader(xml));
        System.out.println(dataSource);
    }

    @XmlRootElement(name = "datasource")
    @XmlAccessorType(XmlAccessType.FIELD)
    private class DataSource {

        @XmlAttribute(name = "formatted-name")
        private String formattedName;
        @XmlAttribute(name = "inline")
        private String inline;
        @XmlElement(name = "repository-location")
        private RepositoryLocation repositoryLocation;

        @XmlAccessorType(XmlAccessType.FIELD)
        private class RepositoryLocation {

            @XmlAttribute(name = "derived-from")
            private String derivedFrom;
            @XmlAttribute(name = "id")
            private String id;
            @XmlAttribute(name = "path")
            private String path;
            @XmlAttribute(name = "revision")
            private String revision;
            @XmlAttribute(name = "site")
            private String site;

            @Override
            public String toString() {
                return "RepositoryLocation{" +
                        "derivedFrom='" + derivedFrom + '\'' +
                        ", id='" + id + '\'' +
                        ", path='" + path + '\'' +
                        ", revision='" + revision + '\'' +
                        ", site='" + site + '\'' +
                        '}';
            }
        }

        @Override
        public String toString() {
            return "DataSource{" +
                    "formattedName='" + formattedName + '\'' +
                    ", inline='" + inline + '\'' +
                    ", repositoryLocation=" + repositoryLocation +
                    '}';
        }
    }
}

Upvotes: 4

Related Questions