diff --git a/libraries/pom.xml b/libraries/pom.xml
index 163f5872ce..69c55c4533 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -772,6 +772,12 @@
test
+
+ com.googlecode.jmapper-framework
+ jmapper-core
+ ${jmapper.version}
+
+
@@ -1015,6 +1021,7 @@
1.19.4
1.6.0
4.5.1
+ 1.6.0.1
3.3.0
3.0.2
diff --git a/libraries/src/main/java/com/baeldung/jmapper/User.java b/libraries/src/main/java/com/baeldung/jmapper/User.java
new file mode 100644
index 0000000000..9f99157183
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/User.java
@@ -0,0 +1,56 @@
+package com.baeldung.jmapper;
+
+import java.time.LocalDate;
+
+
+public class User {
+
+ private long id;
+ private String email;
+ private LocalDate birthDate;
+
+ // constructors
+
+ public User() {
+ super();
+ }
+
+ public User(long id, String email, LocalDate birthDate) {
+ super();
+ this.id = id;
+ this.email = email;
+ this.birthDate = birthDate;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public LocalDate getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(LocalDate birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + ", email=" + email + ", birthDate=" + birthDate + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java
new file mode 100644
index 0000000000..326e8f3cd5
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java
@@ -0,0 +1,69 @@
+package com.baeldung.jmapper;
+
+import java.time.LocalDate;
+import java.time.Period;
+
+import com.googlecode.jmapper.annotations.JMap;
+import com.googlecode.jmapper.annotations.JMapConversion;
+
+public class UserDto {
+
+ @JMap
+ private long id;
+
+ @JMap("email")
+ private String username;
+
+ @JMap("birthDate")
+ private int age;
+
+ @JMapConversion(from={"birthDate"}, to={"age"})
+ public int conversion(LocalDate birthDate){
+ return Period.between(birthDate, LocalDate.now()).getYears();
+ }
+
+ // constructors
+
+ public UserDto() {
+ super();
+ }
+
+ public UserDto(long id, String username, int age) {
+ super();
+ this.id = id;
+ this.username = username;
+ this.age = age;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", username=" + username + ", age=" + age + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java
new file mode 100644
index 0000000000..99247c56f6
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java
@@ -0,0 +1,47 @@
+package com.baeldung.jmapper;
+
+import com.googlecode.jmapper.annotations.JGlobalMap;
+
+@JGlobalMap
+public class UserDto1 {
+
+ private long id;
+ private String email;
+
+
+ // constructors
+
+ public UserDto1() {
+ super();
+ }
+
+ public UserDto1(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java
new file mode 100644
index 0000000000..1238a82684
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java
@@ -0,0 +1,49 @@
+package com.baeldung.jmapper.relational;
+
+import com.googlecode.jmapper.annotations.JMap;
+
+
+public class User {
+
+ @JMap(classes = {UserDto1.class, UserDto2.class})
+ private long id;
+
+ @JMap(attributes = {"username", "email"}, classes = {UserDto1.class, UserDto2.class})
+ private String email;
+
+ // constructors
+
+ public User() {
+ super();
+ }
+
+ public User(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
new file mode 100644
index 0000000000..375fd267a0
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
@@ -0,0 +1,44 @@
+package com.baeldung.jmapper.relational;
+
+
+public class UserDto1 {
+
+ private long id;
+ private String username;
+
+ // constructors
+
+ public UserDto1() {
+ super();
+ }
+
+ public UserDto1(long id, String username) {
+ super();
+ this.id = id;
+ this.username = username;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto [id=" + id + ", username=" + username + "]";
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
new file mode 100644
index 0000000000..d0858c7d8e
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
@@ -0,0 +1,44 @@
+package com.baeldung.jmapper.relational;
+
+
+public class UserDto2 {
+
+ private long id;
+ private String email;
+
+ // constructors
+
+ public UserDto2() {
+ super();
+ }
+
+ public UserDto2(long id, String email) {
+ super();
+ this.id = id;
+ this.email = email;
+ }
+
+ // getters and setters
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDto2 [id=" + id + ", email=" + email + "]";
+ }
+
+}
diff --git a/libraries/src/main/resources/user_jmapper.xml b/libraries/src/main/resources/user_jmapper.xml
new file mode 100644
index 0000000000..f007de9f0a
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/resources/user_jmapper1.xml b/libraries/src/main/resources/user_jmapper1.xml
new file mode 100644
index 0000000000..abcfd77e1c
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/resources/user_jmapper2.xml b/libraries/src/main/resources/user_jmapper2.xml
new file mode 100644
index 0000000000..1e708e14bf
--- /dev/null
+++ b/libraries/src/main/resources/user_jmapper2.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
new file mode 100644
index 0000000000..d2ad65d840
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
@@ -0,0 +1,114 @@
+package com.baeldung.jmapper;
+
+import static com.googlecode.jmapper.api.JMapperAPI.attribute;
+import static com.googlecode.jmapper.api.JMapperAPI.global;
+import static com.googlecode.jmapper.api.JMapperAPI.mappedClass;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.time.LocalDate;
+
+import org.junit.Test;
+
+import com.googlecode.jmapper.JMapper;
+import com.googlecode.jmapper.api.JMapperAPI;
+
+public class JMapperIntegrationTest {
+
+
+ @Test
+ public void giventUser_whenUseAnnotation_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void giventUser_whenUseGlobalMapAnnotation_thenConverted(){
+ JMapper userMapper= new JMapper<>(UserDto1.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+
+ @Test
+ public void giventUser_whenUseAnnotationExplicitConversion_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ assertTrue(result.getAge() > 0);
+ }
+
+ //======================= XML
+
+ @Test
+ public void giventUser_whenUseXml_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml");
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void giventUser_whenUseXmlGlobal_thenConverted(){
+ JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml");
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+
+ // ===== API
+
+ @Test
+ public void giventUser_whenUseApi_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class)
+ .add(attribute("id").value("id"))
+ .add(attribute("username").value("email"))
+ ) ;
+ JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto result = userMapper.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getUsername());
+ }
+
+ @Test
+ public void giventUser_whenUseApiGlobal_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class)
+ .add(global())
+ ) ;
+ JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi);
+
+ User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
+ UserDto1 result = userMapper1.getDestination(user);
+
+ System.out.println(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals(user.getEmail(), result.getEmail());
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
new file mode 100644
index 0000000000..054332a704
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.jmapper;
+
+import static com.googlecode.jmapper.api.JMapperAPI.attribute;
+import static com.googlecode.jmapper.api.JMapperAPI.mappedClass;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.baeldung.jmapper.relational.User;
+import com.baeldung.jmapper.relational.UserDto1;
+import com.baeldung.jmapper.relational.UserDto2;
+import com.googlecode.jmapper.RelationalJMapper;
+import com.googlecode.jmapper.api.JMapperAPI;
+
+public class JMapperRelationalIntegrationTest {
+
+
+ @Test
+ public void giventUser_whenUseAnnotation_thenConverted(){
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class);
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2= relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+ //======================= XML
+
+ @Test
+ public void giventUser_whenUseXml_thenConverted(){
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,"user_jmapper2.xml");
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+
+ // ===== API
+
+ @Test
+ public void giventUser_whenUseApi_thenConverted(){
+ JMapperAPI jmapperApi = new JMapperAPI()
+ .add(mappedClass(User.class)
+ .add(attribute("id").value("id").targetClasses(UserDto1.class,UserDto2.class))
+ .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class,UserDto2.class)) )
+ ;
+ RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,jmapperApi);
+
+ User user = new User(1L,"john@test.com");
+ UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user);
+ UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user);
+
+ System.out.println(result1);
+ System.out.println(result2);
+ assertEquals(user.getId(), result1.getId());
+ assertEquals(user.getEmail(), result1.getUsername());
+ assertEquals(user.getId(), result2.getId());
+ assertEquals(user.getEmail(), result2.getEmail());
+ }
+
+}