JAXB Unmarshals Nested Null Element

XML fragment:

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

I am trying to unmount 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 display the DataSource fields "formattedName" and "inline", but "repositoryLocation" is null. Can someone help please?

+8
java xml jaxb unmarshalling
source share
3 answers

The problem is solved! I noticed that in my java 1.7 library some banks are missing. So I decided to continue upgrading to 1.8. He worked like magic!

+2
source share

JAXB can decrypt without Getters / Setters, and fields can be private. Given the DataSource class above, if some generated toString method is added to both the DataSource and RepositoryLocation , the following returns all the 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 + '}'; } } } 
+3
source share

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

+2
source share

All Articles