Total Pageviews

2018/12/15

[Java] [MapStruct] How to convert Enumeration to String in MapStruct?

Problem
Assume I have an Employee POJO:
package com.example.demo.vo;

import com.example.demo.enumeration.Gender;
import com.example.demo.enumeration.YesOrNoType;

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Employee {

    /**
     * 員工編號
     */
    private Integer id;

    /**
     * 員工姓名
     */
    private String name;

    /**
     * 員工性別
     */
    private Gender gender;

    /**
     * 是否離職
     */
    private YesOrNoType quit;
    

}

and an EmployeeDto POJO:
package com.example.demo.vo;

import lombok.Data;

@Data
public class EmployeeDto {

    /**
     * 員工編號
     */
    private String id;

    /**
     * 員工姓名
     */
    private String name;

    /**
     * 員工性別
     */
    private String gender;

    /**
     * 是否離職
     */
    private String quit; 
    
}

Gender Enumeration:
package com.example.demo.enumeration;

public enum Gender {
    
    MALE("M", "男"), FEMALE("F", "女");

    private final String value;

    private final String description;

    Gender(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

}


YesOrNoType Enumeration:
package com.example.demo.enumeration;

public enum YesOrNoType {
    
    YES("Y", "是"), NO("N", "否");

    private final String value;

    private final String description;

    YesOrNoType(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }
}


If I would like to convert Employee to EmployeeDTO, and convert gender and quit attributes to description, how to do it?

How-To
Add the following configurations in your pom.xml
    <properties>
        <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
            <version>${org.mapstruct.version}</version>
        </dependency>
 </dependencies>
 
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source> <!-- or higher, depending on your project -->
                    <target>1.8</target> <!-- or higher, depending on your project -->
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>


Create an EmployeeMapper:
package com.example.demo.mapStruct;

import org.mapstruct.DecoratedWith;
import org.mapstruct.Mapper;

import com.example.demo.vo.Employee;
import com.example.demo.vo.EmployeeDto;

@Mapper
@DecoratedWith(EmployeeDecorator.class)
public interface EmployeeMapper {

    EmployeeDto toDto(Employee employee);
    
}


Create an EmployeeDecorator:
package com.example.demo.mapStruct;

import com.example.demo.vo.Employee;
import com.example.demo.vo.EmployeeDto;

public class EmployeeDecorator implements EmployeeMapper {

    private EmployeeMapper delegate;

    public EmployeeDecorator(EmployeeMapper delegate) {
        super();
        this.delegate = delegate;
    }

    @Override
    public EmployeeDto toDto(Employee employee) {
        EmployeeDto dto = delegate.toDto(employee);
        dto.setId(employee.getId().toString());
        dto.setGender(employee.getGender().getDescription());
        dto.setQuit(employee.getQuit().getDescription());

        return dto;
    }

}


Create a test class:
package com.example.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.mapstruct.factory.Mappers;

import com.example.demo.enumeration.Gender;
import com.example.demo.enumeration.YesOrNoType;
import com.example.demo.mapStruct.EmployeeMapper;
import com.example.demo.vo.Employee;
import com.example.demo.vo.EmployeeDto;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MapStructTest {

    private static List<Employee> employees = new ArrayList<>();

    static {
        Employee albert = new Employee();
        albert.setId(1);
        albert.setName("Albert");
        albert.setGender(Gender.MALE);
        albert.setQuit(YesOrNoType.NO);

        Employee mandy = new Employee();
        mandy.setId(2);
        mandy.setName("Mandy");
        mandy.setGender(Gender.FEMALE);
        mandy.setQuit(YesOrNoType.NO);

        Employee peter = new Employee();
        peter.setId(3);
        peter.setName("Peter");
        peter.setGender(Gender.MALE);
        peter.setQuit(YesOrNoType.YES);

        employees = Arrays.asList(albert, mandy, peter);

    }

    public static void main(String[] args) {
        EmployeeMapper mapper = Mappers.getMapper(EmployeeMapper.class);
        for (Employee employee : employees) {
            EmployeeDto dto = mapper.toDto(employee);
            log.debug("employee: " + employee.toString() + ", dto : " + dto.toString());
        }
    }

}



10:51:10.018 [main] DEBUG com.example.demo.MapStructTest - employee: Employee(id=1, name=Albert, gender=MALE, quit=NO), dto : EmployeeDto(id=1, name=Albert, gender=, quit=)
10:51:10.020 [main] DEBUG com.example.demo.MapStructTest - employee: Employee(id=1, name=Mandy, gender=FEMALE, quit=NO), dto : EmployeeDto(id=2, name=Mandy, gender=, quit=)
10:51:10.020 [main] DEBUG com.example.demo.MapStructTest - employee: Employee(id=3, name=Peter, gender=MALE, quit=YES), dto : EmployeeDto(id=3, name=Peter, gender=, quit=)




No comments: