In previous posts under MapStruct, I introduced you guys to expressions and then I showed how we can use a source object in an expressions.
Just to be thorough, in this post under MapStruct, I will show with example that we can refer multiple source objects in an expressions.
For our example, we use below classes as source
Contract
package package33;public class Contract { private double hourlyRate; public Contract(double hourlyRate) { this.hourlyRate = hourlyRate; } public double getHourlyRate() { return hourlyRate; }}
Timesheet
package package33;public class Timesheet { private int hoursWorked; public Timesheet(int hoursWorked) { this.hoursWorked = hoursWorked; } public int getHoursWorked() { return hoursWorked; }}
Employee
package package33;public class Employee { private String name; public Employee(String name) { this.name = name; } //Removed getter and setter for brevity}
Now we need to map “Employee” class to “EmployeeDTO” whose structure is as shown below
EmployeeDTO
package package33;public class EmployeeDTO { private String name; private double salary; //Removed getter, setter, and toString for brevity}
We will be mapping “Employee” object to “EmployeeDTO” object. We can get name from “Employee” but to calculate salary we will be using “Contract” object and “Timesheet” object.
Below is the mapper interface
EmployeeMapper
package package33;import org.mapstruct.Mapper;import org.mapstruct.Mapping;@Mapperpublic interface EmployeeMapper { @Mapping(target = "salary", expression = "java(contract.getHourlyRate() * timesheet.getHoursWorked())") public EmployeeDTO employeeToEmployeeDTO(Employee employee, Contract contract, Timesheet timesheet);}
As you can see in the above expression, we are using two object to calculate value for “salary” field in EmployeeDTO (i.e., “Contract” object and “Timesheet” object).
These two objects “Contract” and “Timesheet” are present as source parameters to “employeeToEmployeeDTO” method.
In this way we can use multiple source objects in the expression.
Below is the main class that shows the usage.
Main class
package package33;import org.mapstruct.factory.Mappers;public class Example33 { public static void main(String[] args) { EmployeeMapper employeeMapper = Mappers.getMapper(EmployeeMapper.class); Employee employee = new Employee("John Doe"); Contract contract = new Contract(100); Timesheet timesheet = new Timesheet(8); EmployeeDTO employeeDTO = employeeMapper.employeeToEmployeeDTO(employee, contract, timesheet); System.out.println(employeeDTO); }}
Below is the output
Output
EmployeeDTO{name='John Doe', salary=800.0}