使用mapstruct做对象属性转换
MapStruct是一个Java注解处理器,它可以自动生成类型安全的Java Bean映射代码。MapStruct的主要目的是简化Java Bean之间的映射,它通过注解来指定Java Bean之间的映射规则,然后自动生成映射代码。
在MapStruct中,有几个常用的注解:
-
@Mapper:用于指定一个Java Bean映射器接口,该接口定义了Java Bean之间的映射规则。
-
@Mapping:用于指定Java Bean属性之间的映射关系。
-
@Mappings:用于指定多个@Mapping注解,可以将多个Java Bean属性之间的映射关系组合在一起。
-
@InheritInverseConfiguration:用于指定一个反向映射规则,可以将目标Java Bean映射回源Java Bean。
-
@MappingTarget:用于指定一个目标Java Bean对象,可以将源Java Bean映射到目标Java Bean对象中。
-
@AfterMapping:用于指定一个方法,在Java Bean映射完成后调用该方法。
下面是一个简单的MapStruct示例,其中定义了一个Java Bean映射器接口,用于将SourceBean映射到TargetBean中:
@Mapper
public interface BeanMapper {
@Mapping(source = "sourceField", target = "targetField")
TargetBean map(SourceBean sourceBean);
}
在上面的示例中,@Mapper注解用于指定BeanMapper接口是一个Java Bean映射器接口。@Mapping注解用于指定sourceField属性映射到targetField属性。然后,MapStruct会自动生成BeanMapper接口的实现代码,用于将SourceBean映射到TargetBean中。
需要注意的是,MapStruct中的注解非常灵活,可以根据实际需求进行组合和使用。同时,MapStruct还提供了丰富的配置选项,可以进一步定制生成的Java Bean映射代码。
MapStruct 的主要优点:
- 生成类型安全的代码,减少了手写代码的错误和冗余;
- 支持多种映射策略,包括注解、XML 配置、Java SPI 等;
- 支持复杂类型的映射,如集合、嵌套对象等;
- 支持自定义转换器,可以自定义转换逻辑;
- 易于集成到现有项目中。
MapStruct 的使用步骤:
- 定义源类型和目标类型的 Java bean;
- 在源类型和目标类型中添加注解;
- 创建一个 Mapper 接口,并使用 @Mapper 注解标记它;
- 在 Mapper 接口中定义映射方法,使用 @Mapping 注解标记映射关系;
- 在需要进行映射的地方,使用 Mapper 接口的实现类进行映射。
示例:
假设有一个 User 类和一个 UserDto 类,需要将它们进行映射。
User 类:
public class User {
private Long id;
private String name;
private Integer age;
// getter/setter 略
}
UserDto 类:
public class UserDto {
private Long id;
private String username;
private Integer age;
// getter/setter 略
}
Mapper 接口:
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mapping(source = "name", target = "username")
UserDto userToUserDto(User user);
}
使用示例:
User user = new User();
user.setId(1L);
user.setName("Tom");
user.setAge(18);
UserDto userDto = UserMapper.INSTANCE.userToUserDto(user);
以上代码将会把 User 对象映射为 UserDto 对象,其中 User 的 name 属性会被映射到 UserDto 的 username 属性。
项目中使用示例:
1、引入依赖
<!--工具类:数据映射-->
<properties>
<mapstruct.version>1.5.5.Final</mapstruct.version>
</properties>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
2、自定义转换接口
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import java.util.List;
/**
* @since 2023/8/17
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface ObjectConverter {
/**
* request to dto list
*
* @param list
* @return
*/
List<TargetObjectDTO> toDtoList(List<SourceObjectDTO> list);
}
3、接口调用
public class CustomerController {
private final ObjectConverter converter;
public ApiResponse<Boolean> saveBatch(@RequestBody List<SourceObjectDTO> list) {
boolean result = converter.toDtoList(list);
return ApiResponse.ok(null);
}
}
@MappingTarget 注解: