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?
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 +
'}';
}
}
}
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With