I thought it may be nice for those googlers that want to know about JAXB, to have a quick working example to use. So, that is the purpose of this post.
First off, what is JAXB? Well, simply put, JAXB is for converting Java objects to XML or from XML to Java objects. With the advent of Java 1.5, and annotations, this becomes extremely simple.
Download JAXB, dependencies to your local computer, and put them in a folder called “libs”. The dependencies JARs I have are…
- activation-1.1.jar
- jaxb-api-2.0.jar
- jaxb-impl-2.0.5.jar
- jsr173_api-1.0.jar
Copy the following Java source code to Employee.java, and proceed with the instructions below
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.annotation.*; import java.io.StringReader; import java.io.StringWriter; @XmlRootElement(name = "employee") @XmlAccessorType(XmlAccessType.FIELD) public class Employee { public static void main(String args[]) throws JAXBException { final Employee john = new Employee(); john.setId(1); john.setFirstName("John"); john.setMiddleName("Robert"); john.setLastName("Doe"); // write it out as XML final JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class); StringWriter writer = new StringWriter(); jaxbContext.createMarshaller().marshal(john, writer); // read it from XML final Employee johnRead = (Employee) jaxbContext.createUnmarshaller().unmarshal( new StringReader(writer.toString())); if (john.equals(johnRead)) { // write the new object out as XML again. writer = new StringWriter(); jaxbContext.createMarshaller().marshal(johnRead, writer); System.out.println( "johnRead was identical to john: \n" + writer.toString()); } else { System.out.println("john and johnRead are not equal"); } } @XmlAttribute private int id; /** * Employee's first name */ @XmlElement private String firstName; /** * Employee's middle name */ @XmlElement private String middleName; /** * Employee's last name */ @XmlElement private String lastName; public Employee() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; if (id != employee.id) return false; if (firstName != null ? !firstName.equals(employee.firstName) : employee.firstName != null) return false; if (lastName != null ? !lastName.equals(employee.lastName) : employee.lastName != null) return false; if (middleName != null ? !middleName.equals(employee.middleName) : employee.middleName != null) return false; return true; } @Override public int hashCode() { int result = id; result = 31 * result + (firstName != null ? firstName.hashCode() : 0); result = 31 * result + (middleName != null ? middleName.hashCode() : 0); result = 31 * result + (lastName != null ? lastName.hashCode() : 0); return result; } @Override public String toString() { return "Employee{" + "id=" + id + ", firstName='" + firstName + '\'' + ", middleName='" + middleName + '\'' + ", lastName='" + lastName + '\'' + '}'; } } |
The following commands will compile and run the source, if under a unix OS. If in windows, you’ll need to form your own classpath.
javac -classpath .:$(for jar in libs/*.jar; do echo -n "$jar:"; done) Employee.java java -classpath .:$(for jar in libs/*.jar; do echo -n "$jar:"; done) Employee |
The output should be as follows, but the XML will be on a single line…
johnRead was identical to john: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <employee id="1"> <firstName>John</firstName> <middleName>Robert</middleName> <lastName>Doe</lastName> </employee> |