In this post, we will see Orika Mapper Example from scratch. Orika is used to copy data from one object to another object.
Simple Orika mapper Example – Default mapping.
maven dependency.
<dependencies>
<!-- https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core -->
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.4</version>
</dependency>
</dependencies>
Student.java
public class Student {
private String name;
private String id;
//getter-setter
}
StudentDto.java
public class StudentDTO {
private String name;
private String id;
//getter-setter
}
OrikaConfig.java
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDTO.class).byDefault().register();
}
}
Note – We can use field() method to define field name. Since both class(Student.java & StudentDto.java contains same field name, by defaut Orika will map these). The below code will give the same output.
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDTO.class)
.field("name", "name")
.field("id", "id")
.byDefault().register();
}
OrikaExample.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setId("1");
s.setName("John");
StudentDTO studentDto = facade.map(s, StudentDTO.class);
System.out.println(studentDto.getId());
System.out.println(studentDto.getName());
}
}
Output –
Map fields with different names
Student.java
public class Student {
private String name;
private String id;
//getter-setter
}
StudentDto.java
public class StudentDTO {
private String studentName;
private String studentId;
//getter-setter
}
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDTO.class)
.field("name", "studentName")
.field("id", "studentId")
.byDefault().register();
}
}
OrikaExample.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setId("1");
s.setName("John");
StudentDTO studentDto = facade.map(s, StudentDTO.class);
System.out.println(studentDto.getStudentId());
System.out.println(studentDto.getStudentName());
}
}
Map Fields for Nested Objects.
Address.java
package javaorikamapperexample;
public class Address {
String cityName;
//getter-setter
}
Student.java
package javaorikamapperexample;
public class Student {
private String name;
private String id;
private Address address;
// getter-setter
}
package javaorikamapperexample;
public class StudentDTO {
private String name;
private String id;
private String cityName;
// getter-setter
}
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDTO.class)
.field("name", "name")
.field("id", "id")
.field("address.cityName", "cityName")
.byDefault().register();
}
}
OrikaExample.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setId("1");
s.setName("John");
Address address = new Address();
address.setCityName("France");
s.setAddress(address);
StudentDTO studentDto = facade.map(s, StudentDTO.class);
System.out.println(studentDto.getName());
System.out.println(studentDto.getId());
System.out.println(studentDto.getCityName());
}
}
Output –
Orika mapper list example
mapAsList() example
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class)
.byDefault().register();
}
}
OrikaExample.java
package javaorikamapperexample;
import java.util.ArrayList;
import java.util.List;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setId("1");
s.setName("John");
List<Student> students = new ArrayList<Student>();
students.add(s);
List<StudentDto> studentDtos = facade.mapAsList(students, StudentDto.class);
System.out.println(studentDtos.get(0).getId());
System.out.println(studentDtos.get(0).getName());
}
}
Orika list type field example
Student.java
package javaorikamapperexample;
import java.util.List;
public class Student {
private List<String> names;
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
}
StudentDto.java
package javaorikamapperexample;
public class StudentDto {
private String firstName;
private String lastName;
//getter & setter
}
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class)
.field("names[0]", "firstName")
.field("names[1]", "lastName").register();
}
}
OrikaExample.java
package javaorikamapperexample;
import java.util.ArrayList;
import java.util.List;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
List<String> names = new ArrayList<String>();
names.add("jack");
names.add("sparrow");
Student s = new Student();
s.setNames(names);
StudentDto studentDto= facade.map(s, StudentDto.class);
System.out.println(studentDto.getFirstName());
System.out.println(studentDto.getLastName());
}
}
Excluding field – exclude() method example
Student.java
package javaorikamapperexample;
public class Student {
private String name;
private String id;
private String rollNumber;
//getter-setter example
}
StudentDto.java
package javaorikamapperexample;
public class StudentDto {
private String name;
private String id;
private String rollNumber;
//getter & setter
}
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class).exclude("rollNumber").byDefault().register();
}
}
OrikaExample.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setName("jack");
s.setId("1");
s.setRollNumber("10");
StudentDto studentDto = facade.map(s, StudentDto.class);
System.out.println(studentDto.getName());
System.out.println(studentDto.getId());
System.out.println(studentDto.getRollNumber());
}
}
StudentDto object is created using facade.map() method. All Student attributes are getting populated to StudentDto object.
Orika mapper custom converter Example
Defining orika custom converter extending Converter class
package javaorikamapperexample;
import java.util.Date;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;
public class MyCustomConverter extends CustomConverter<Date, MyCustomDate> {
public MyCustomDate convert(Date date, Type<? extends MyCustomDate> destinationType,
MappingContext mappingContext) {
MyCustomDate myCustomDate = new MyCustomDate();
myCustomDate.setDateOfBirthDay(date.getDate());
myCustomDate.setDateOfBirthMonth(date.getMonth());
myCustomDate.setDateOfBirthYear(date.getYear());
return myCustomDate;
}
}
Registering Converters Globally
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class).byDefault().register();
ConverterFactory converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(new MyCustomConverter());
}
}
Let’s see complete example.
Directory structure.
Student.java
package javaorikamapperexample;
import java.util.Date;
public class Student {
private String name;
private String id;
private Date dateOfBirth;
//getter & setter
}
StudentDto.java
package javaorikamapperexample;
public class StudentDto {
private String name;
private String id;
private MyCustomDate dateOfBirth;
//getter & setter
}
OrikaConfig.java
package javaorikamapperexample;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class).byDefault().register();
ConverterFactory converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(new MyCustomConverter());
}
}
OrikaExample.java
MyCustomConverter.java
package javaorikamapperexample;
import java.util.Date;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;
public class MyCustomConverter extends CustomConverter<Date, MyCustomDate> {
public MyCustomDate convert(Date date, Type<? extends MyCustomDate> destinationType,
MappingContext mappingContext) {
MyCustomDate myCustomDate = new MyCustomDate();
myCustomDate.setDateOfBirthDay(date.getDate());
myCustomDate.setDateOfBirthMonth(date.getMonth());
myCustomDate.setDateOfBirthYear(date.getYear());
return myCustomDate;
}
}
MyCustomDate.java
package javaorikamapperexample;
public class MyCustomDate {
private int dateOfBirthDay;
private int dateOfBirthMonth;
private int dateOfBirthYear;
public int getDateOfBirthDay() {
return dateOfBirthDay;
}
public void setDateOfBirthDay(int dateOfBirthDay) {
this.dateOfBirthDay = dateOfBirthDay;
}
public int getDateOfBirthMonth() {
return dateOfBirthMonth;
}
public void setDateOfBirthMonth(int dateOfBirthMonth) {
this.dateOfBirthMonth = dateOfBirthMonth;
}
public int getDateOfBirthYear() {
return dateOfBirthYear;
}
public void setDateOfBirthYear(int dateOfBirthYear) {
this.dateOfBirthYear = dateOfBirthYear;
}
}
package javaorikamapperexample;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import ma.glasnost.orika.MapperFacade;
public class OrikaExample {
public static void main(String[] args) throws ParseException {
MapperFacade facade = new OrikaConfig();
Student s = new Student();
s.setName("jack");
s.setId("1");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1980-07-26");
s.setDateOfBirth(date);
StudentDto studentDto = facade.map(s, StudentDto.class);
System.out.println(studentDto.getName());
System.out.println(studentDto.getId());
System.out.println(studentDto.getDateOfBirth().getDateOfBirthDay());
System.out.println(studentDto.getDateOfBirth().getDateOfBirthMonth());
System.out.println(studentDto.getDateOfBirth().getDateOfBirthYear());
}
}
Output
Spring Boot Orika mapper MySql Example
Open eclipse and create maven project, Don’t forget to check ‘Create a simple project (skip)’ click on next. Fill all details(GroupId – springbootorikaexample, ArtifactId – springbootorikaexample, and name – springbootorikaexample) and click on finish. Keep packaging as the jar.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springbootorikaexample</groupId>
<artifactId>springbootorikaexample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootorikaexample</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core -->
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.4</version>
</dependency>
</dependencies>
</project>
Directory structure.
Define entity class – Student.java
package com.springbootorikaexample.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "roll_number")
private String rollNumber;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNumber() {
return rollNumber;
}
public void setRollNumber(String rollNumber) {
this.rollNumber = rollNumber;
}
}
Define DTO – StudentDto.java
package com.springbootorikaexample.dto;
public class StudentDto {
private Long id;
private String name;
private String rollNumber;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNumber() {
return rollNumber;
}
public void setRollNumber(String rollNumber) {
this.rollNumber = rollNumber;
}
}
Define Repository interface.
package com.springbootorikaexample.repository;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.springbootorikaexample.entity.Student;
@Repository
public interface StudentRepository extends JpaRepository<Student, Serializable> {
}
Define service interface.
package com.springbootorikaexample.service;
import org.springframework.stereotype.Component;
import com.springbootorikaexample.entity.Student;
@Component
public interface StudentService {
public Student save(Student student);
public Student get(Long id);
}
Define StudentServiceImpl.java class.
package com.springbootorikaexample.serviceimpl;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.springbootorikaexample.entity.Student;
import com.springbootorikaexample.repository.StudentRepository;
import com.springbootorikaexample.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentRepository studentRepository;
@Transactional
public Student save(Student student) {
Student createResponse = studentRepository.save(student);
return createResponse;
}
@Transactional
public Student get(Long id) {
Optional<Student> response = studentRepository.findById(id);
Student getResponse = response.get();
return getResponse;
}
}
Define controller class – StudentController.java
package com.springbootorikaexample.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.springbootorikaexample.dto.StudentDto;
import com.springbootorikaexample.entity.Student;
import com.springbootorikaexample.service.StudentService;
import ma.glasnost.orika.MapperFacade;
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
@Autowired
private MapperFacade facade;
@PostMapping("/create")
public Student createStudent1(@RequestBody Student student) {
Student createResponse = studentService.save(student);
return createResponse;
}
@GetMapping("/{id}")
public StudentDto getStudent(@PathVariable Long id) {
Student entity = studentService.get(id);
StudentDto response = facade.map(entity, StudentDto.class);
return response;
}
}
JpaConfig.java
package com.springbootorikaexample.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import ma.glasnost.orika.MapperFacade;
@Configuration
@EnableJpaRepositories(basePackages = "com.springbootorikaexample.repository")
public class JpaConfig {
@Bean
public MapperFacade mapperFacade() {
MapperFacade facade = new OrikaConfig();
return facade;
}
}
OrikaConfig.java
package com.springbootorikaexample.config;
import com.springbootorikaexample.dto.StudentDto;
import com.springbootorikaexample.entity.Student;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
public class OrikaConfig extends ConfigurableMapper {
protected void configure(MapperFactory factory) {
factory.classMap(Student.class, StudentDto.class).byDefault().register();
}
}
SpringMain.java
package com.springbootorikaexample.main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = "com.springbootorikaexample.*")
@EntityScan("com.springbootorikaexample.*")
public class SpringMain {
public static void main(String[] args) {
SpringApplication.run(SpringMain.class, args);
}
}
application.yml
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: create
datasource:
url: jdbc:mysql://localhost:3306/springbootcrudexample
username: root
password: root
server:
port: 9091
Let’s Run the application.
Create Student using below API.
http://localhost:9091/student/create
Now perform GET operation.
http://localhost:9091/student/1
That’s all about Orika Mapper Example.
You may like.
- Spring Boot CRUD Example With MySQL/PostgreSQL.
- Hazelcast Cache Spring Boot Example.
- Spring Data JPA Interview Questions and Answers.
- Hibernate First Level Cache example using Spring Boot.
- JPA EntityManager CRUD example Using Spring Boot.
- Hibernate/JPA EhCache Configuration Example.
Summary – We have seen about Orika Mapper Example.
Download the Source Code of Orika Mapper Example from GitHub.
See Orika Docs here.