diff --git a/jaxb/pom.xml b/jaxb/pom.xml
new file mode 100644
index 0000000000..cce40c55d4
--- /dev/null
+++ b/jaxb/pom.xml
@@ -0,0 +1,170 @@
+
+ 4.0.0
+ com.baeldung
+ jaxb
+ 0.0.1-SNAPSHOT
+ jaxb
+
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ ${jaxb.version}
+
+
+
+ org.glassfish.jaxb
+ jaxb-core
+ ${jaxb.version}
+
+
+
+
+ com.sun.istack
+ istack-commons-runtime
+ 3.0.2
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+
+
+
+ jaxb
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+ org.codehaus.mojo
+ jaxb2-maven-plugin
+ [${jaxb2-maven-plugin.version},)
+
+ schemagen
+ xjc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.codehaus.mojo
+ jaxb2-maven-plugin
+ ${jaxb2-maven-plugin.version}
+
+
+ xjc
+
+ xjc
+
+
+
+
+
+ src/main/resources/global.xjb
+
+
+ src/main/resources/user.xsd
+
+ ${basedir}/src/main/java
+ false
+
+
+
+
+
+
+
+
+
+
+ 2.2.11
+
+
+ 1.7.21
+ 1.1.7
+
+
+ 3.5.1
+ 2.3
+
+
+
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Book.java b/jaxb/src/main/java/com/baeldung/jaxb/Book.java
new file mode 100644
index 0000000000..8455d3e6df
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/Book.java
@@ -0,0 +1,58 @@
+package com.baeldung.jaxb;
+
+import java.util.Date;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlRootElement(name = "book")
+@XmlType(propOrder = { "id", "name", "date" })
+public class Book {
+ private Long id;
+ private String name;
+ private String author;
+ private Date date;
+
+ @XmlAttribute
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @XmlElement(name = "title")
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @XmlTransient
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ @Override
+ public String toString() {
+ return "Book [id=" + id + ", name=" + name + ", author=" + author + ", date=" + date + "]";
+ }
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java
new file mode 100644
index 0000000000..6631525619
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java
@@ -0,0 +1,28 @@
+package com.baeldung.jaxb;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class DateAdapter extends XmlAdapter {
+
+ private static final ThreadLocal dateFormat = new ThreadLocal() {
+
+ @Override
+ protected DateFormat initialValue() {
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ }
+ };
+
+ @Override
+ public Date unmarshal(String v) throws Exception {
+ return dateFormat.get().parse(v);
+ }
+
+ @Override
+ public String marshal(Date v) throws Exception {
+ return dateFormat.get().format(v);
+ }
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Main.java b/jaxb/src/main/java/com/baeldung/jaxb/Main.java
new file mode 100644
index 0000000000..aaf062dd4e
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/Main.java
@@ -0,0 +1,39 @@
+package com.baeldung.jaxb;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Date;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+public class Main {
+ public static void marshal() throws JAXBException, IOException {
+ Book book = new Book();
+ book.setId(1L);
+ book.setName("Book1");
+ book.setAuthor("Author1");
+ book.setDate(new Date());
+
+ JAXBContext context = JAXBContext.newInstance(Book.class);
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ marshaller.marshal(book, new File("./book.xml"));
+ }
+
+ public static Book unMashal() throws JAXBException, IOException {
+ JAXBContext context = JAXBContext.newInstance(Book.class);
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ Book book = (Book) unmarshaller.unmarshal(new FileReader("./book.xml"));
+ return book;
+ }
+
+ public static void main(String[] args) throws JAXBException, IOException {
+ marshal();
+ Book book = unMashal();
+ System.out.println(book.toString());
+ }
+}
diff --git a/jaxb/src/main/resources/global.xjb b/jaxb/src/main/resources/global.xjb
new file mode 100644
index 0000000000..de9dcf1577
--- /dev/null
+++ b/jaxb/src/main/resources/global.xjb
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxb/src/main/resources/logback.xml b/jaxb/src/main/resources/logback.xml
new file mode 100644
index 0000000000..8b566286b8
--- /dev/null
+++ b/jaxb/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxb/src/main/resources/user.xsd b/jaxb/src/main/resources/user.xsd
new file mode 100644
index 0000000000..18d2b95d10
--- /dev/null
+++ b/jaxb/src/main/resources/user.xsd
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file