MapStruct 封装
时间: 2025-06-06 16:19:13 浏览: 10
### MapStruct 封装示例与最佳实践
MapStruct 是一个用于 Java 的代码生成器,旨在简化对象之间映射的过程。通过注解处理器,MapStruct 能够自动生成类型安全的映射代码,从而减少手动编写转换逻辑的工作量[^1]。
以下是使用 MapStruct 进行封装的最佳实践和示例:
#### 1. 基本配置
为了使用 MapStruct,首先需要在项目中添加依赖项。以 Maven 为例,可以添加以下依赖:
```xml
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
```
#### 2. 创建 Mapper 接口
定义一个接口并使用 `@Mapper` 注解。例如:
```java
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface UserMapper {
@Mapping(source = "firstName", target = "name")
UserDto userToUserDto(User user);
}
```
上述代码会自动生成一个实现类,将 `User` 对象转换为 `UserDto` 对象,并将 `firstName` 属性映射到目标对象的 `name` 属性[^1]。
#### 3. 使用复杂的映射逻辑
如果需要更复杂的映射逻辑,可以通过自定义方法实现。例如:
```java
@Mapper
public interface ComplexMapper {
@Mapping(target = "fullName", expression = "java(source.getFirstName() + \" \" + source.getLastName())")
TargetDto sourceToTargetDto(Source source);
}
```
此处使用了 `expression` 属性来定义如何生成目标对象的 `fullName` 属性[^1]。
#### 4. 处理嵌套对象
对于包含嵌套对象的映射,MapStruct 支持递归映射。例如:
```java
@Mapper
public interface NestedMapper {
TargetDto sourceToTargetDto(Source source);
@Mapping(source = "address.city", target = "cityName")
TargetDto mapSourceToTarget(Source source);
}
```
这段代码会自动处理 `address` 对象中的 `city` 属性映射。
#### 5. 配置未映射的目标属性
当存在未映射的目标属性时,可以通过 `@Mapper` 注解的 `unmappedTargetPolicy` 属性设置警告或错误策略。例如:
```java
@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
public interface StrictMapper {
TargetDto sourceToTargetDto(Source source);
}
```
这样可以确保所有目标属性都被正确映射,否则编译会失败[^1]。
#### 6. 使用构建器模式
如果目标对象支持构建器模式,可以通过 `@Mapping` 注解指定使用构建器。例如:
```java
@Mapper
public interface BuilderMapper {
@Mapping(target = "name", source = "firstName")
TargetDto.TargetDtoBuilder sourceToTargetDtoBuilder(Source source);
default TargetDto sourceToTargetDto(Source source) {
return sourceToTargetDtoBuilder(source).build();
}
}
```
此代码片段展示了如何结合构建器模式生成目标对象实例。
#### 最佳实践总结
- **保持简单**:尽量避免复杂的映射逻辑,优先使用简单的字段映射。
- **命名一致性**:源对象和目标对象的字段命名应尽可能一致,以便 MapStruct 自动推断映射关系。
- **使用注解**:通过注解明确指定复杂的映射规则,提高代码可读性和维护性。
- **测试映射逻辑**:为生成的映射代码编写单元测试,确保其行为符合预期。
阅读全文
相关推荐


















