Using MapStruct for Efficient Java Bean Mapping
MapStruct is a compile‑time Java bean‑mapping generator that, when added as an annotation processor in Maven, Gradle or an IDE, lets developers define @Mapper interfaces to automatically produce type‑safe, high‑performance implementations—including custom field mappings, nested collections, and lifecycle hooks—thereby eliminating boilerplate code and centralizing mapping logic.
MapStruct is a compile‑time code generator for Java bean mapping that follows the principle of convention over configuration, providing fast, type‑safe and maintainable object conversions.
It integrates via an annotation processor into Maven, Gradle or IDEs, allowing developers to define a dedicated mapping layer. Basic usage involves adding MapStruct (and optionally Lombok) dependencies and creating mapper interfaces annotated with @Mapper(componentModel = "spring") . Example:
@Mapper(componentModel = "spring")
public interface OrderInfoTransferInterface {
OrderInfoDTO toDTOByOrderInfo(OrderInfo order);
}Entity classes:
@Getter @Setter
public class OrderInfo {
private Long id;
private Integer dcId;
private Integer storeId;
} @Getter @Setter
public class OrderInfoDTO {
private Long id;
private Integer dcId;
private Integer storeId;
}After compilation MapStruct generates an implementation that directly calls getters and setters, e.g.:
@Generated(...)
@Component
public class OrderInfoTransferInterfaceImpl implements OrderInfoTransferInterface {
@Override
public OrderInfoDTO toDTOByOrderInfo(OrderInfo order) {
if (order == null) {
return null;
}
OrderInfoDTO dto = new OrderInfoDTO();
dto.setId(order.getId());
dto.setDcId(order.getDcId());
dto.setStoreId(order.getStoreId());
return dto;
}
}MapStruct supports advanced mapping strategies such as custom field names, default values, constant values, date and number formatting, enum‑String conversion, and nested or collection mappings using @Mapping , @IterableMapping , and @Named . For example, mapping a list of child objects:
@Mapper(componentModel = "spring", uses = {OrderInfoDetailTransferDemoInterface.class})
public interface OrderInfoTransferDemoInterface {
@Mapping(source = "orderDetails", target = "orderDetails", qualifiedByName = "toDetailDTO")
OrderInfoDTO toDTO(OrderInfo source);
}Custom logic can be added with @BeforeMapping and @AfterMapping methods, and expressions can be used via @Mapping(expression = "java(UUID.randomUUID().toString())") . The generated code respects these customizations.
Typical Maven configuration:
8
8
1.5.3.Final
1.16.14
org.mapstruct
mapstruct
${org.mapstruct.version}
org.projectlombok
lombok
${org.projectlombok.version}
provided
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${java.version}
org.mapstruct
mapstruct-processor
${org.mapstruct.version}
org.projectlombok
lombok
${org.projectlombok.version}By leveraging MapStruct, developers can reduce boilerplate mapping code, improve performance compared with reflection‑based utilities, and keep mapping logic centralized and type‑safe.
DaTaobao Tech
Official account of DaTaobao Technology
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.