SpringBoot使用MapStruct生成映射代码的示例详解
作者:鹏阿鹏
定义
MapStruct 是一个用于 Java 的代码生成器,专门用于生成类型安全的 bean 映射代码。它通过注解处理器在编译时生成映射代码,从而避免了运行时的性能开销和潜在的错误。
MapStruct 的主要目标是简化和加速 Java 对象之间的转换,特别是当这些对象具有相似的结构时。
相关概念
Mapper
接口 Mapper 接口定义了对象之间的映射方法。你可以通过在接口上使用 @Mapper
注解来标记这个接口是一个映射器。MapStruct 会在编译时生成这个接口的实现类。Mapping
注解 @Mapping 注解用于定义源对象和目标对象之间的字段映射关系。你可以在 Mapper
接口的方法上使用这个注解来指定具体的映射规则。Mappings
注解 @Mappings 注解是 @Mapping 注解的容器,用于定义多个字段映射。Component Model
通过 componentModel 属性,你可以指定生成的 Mapper 实现类的组件模型,例如Spring、CDI 或默认的无组件模型。
使用示例
- 定义源对象和目标对象
public class Source { private String name; private int age; private String address; // getters and setters } public class Target { private String fullName; private int age; private String location; // getters and setters }
- 定义Mapper接口
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface SourceTargetMapper { SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class); @Mapping(source = "name", target = "fullName") @Mapping(source = "address", target = "location") Target sourceToTarget(Source source); @Mapping(source = "fullName", target = "name") @Mapping(source = "location", target = "address") Source targetToSource(Target target); }
或者,可以使用 @Mappings 注解来包含多个 @Mapping 注解。@Mappings 注解是 @Mapping 注解的容器,用于定义多个字段映射。
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; @Mapper public interface SourceTargetMapper { SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class); @Mappings({ @Mapping(source = "name", target = "fullName"), @Mapping(source = "address", target = "location") }) Target sourceToTarget(Source source); @Mappings({ @Mapping(source = "fullName", target = "name"), @Mapping(source = "location", target = "address") }) Source targetToSource(Target target); }
- 主方法
public class Main { public static void main(String[] args) { Source source = new Source(); source.setName("John Doe"); source.setAge(30); source.setAddress("123 Main St"); SourceTargetMapper mapper = SourceTargetMapper.INSTANCE; Target target = mapper.sourceToTarget(source); System.out.println("Target Full Name: " + target.getFullName()); System.out.println("Target Age: " + target.getAge()); System.out.println("Target Location: " + target.getLocation()); } }
与Spring集成
通过设置 componentModel = "spring"
,你可以将生成的 Mapper 实现类作为 Spring 组件进行管理,从而在 Spring 容器中进行依赖注入。
@Mapper(componentModel = "spring") public interface SourceTargetMapper { // 映射方法 }
使用如下
@Service public class SomeService { private final SourceTargetMapper sourceTargetMapper; @Autowired public SomeService(SourceTargetMapper sourceTargetMapper) { this.sourceTargetMapper = sourceTargetMapper; } // 使用 sourceTargetMapper 进行对象转换 }
表达式功能
可以使用 expression 属性在 @Mapping 注解中指定自定义的表达式。
示例场景:假设我们有一个场景,需要将一个包含日期字符串的源对象转换为目标对象,并且需要将日期字符串解析为 java.util.Date 对象。我们将使用 java.text.SimpleDateFormat 类来解析日期字符串。
public class Source { private String dateString; // getters and setters } public class Target { private Date date; // getters and setters }
定义日期解析工具类
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateParser { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); public static Date parse(String dateString) throws ParseException { return DATE_FORMAT.parse(dateString); } }
定义Mapper接口,注意注解中的imports和expression
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; @Mapper(componentModel = "spring", imports = {DateParser.class, ParseException.class}) public interface SourceTargetMapper { SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class); @Mappings({ @Mapping(target = "date", expression = "java(DateParser.parse(source.getDateString()))") }) Target sourceToTarget(Source source) throws ParseException; }
在这个 Mapper接口中,使用了 imports 属性导入了 DateParser 和 ParseException 类。然后在 @Mapping 注解的 expression 属性中,通过 DateParser.parse(source.getDateString()) 来将 dateString 转换为 Date 对象。
public class Main { public static void main(String[] args) { Source source = new Source(); source.setDateString("2024-11-25"); SourceTargetMapper mapper = SourceTargetMapper.INSTANCE; try { Target target = mapper.sourceToTarget(source); System.out.println("Target Date: " + target.getDate()); } catch (ParseException e) { e.printStackTrace(); } } }
在这个示例中,创建了一个包含日期字符串的 Source 对象,并使用 SourceTargetMapper 将其转换为 Target 对象。转换过程中,DateParser 类的 parse 方法被调用,将日期字符串解析为 Date 对象。
依赖:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> <!-- 请根据需要替换为最新版本 --> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <!-- 请根据需要替换为最新版本 --> <scope>provided</scope> </dependency>
以上就是SpringBoot使用MapStruct生成映射代码的示例详解的详细内容,更多关于SpringBoot MapStruct生成映射的资料请关注脚本之家其它相关文章!