欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【SpringBoot】MapStruct生成映射代码

【SpringBoot】MapStruct生成映射代码

2025/2/23 23:59:40 来源:https://blog.csdn.net/AwesomeP/article/details/144027771  浏览:    关键词:【SpringBoot】MapStruct生成映射代码

文章目录

    • 定义
    • 相关概念
    • 使用示例
    • 与Spring集成
    • 表达式功能

定义

MapStruct 是一个用于 Java 的代码生成器,专门用于生成类型安全的 bean 映射代码。它通过注解处理器在编译时生成映射代码,从而避免了运行时的性能开销和潜在的错误。

MapStruct 的主要目标是简化和加速 Java 对象之间的转换,特别是当这些对象具有相似的结构时。

相关概念

  • Mapper 接口 Mapper 接口定义了对象之间的映射方法。你可以通过在接口上使用 @Mapper
    注解来标记这个接口是一个映射器。MapStruct 会在编译时生成这个接口的实现类。
  • Mapping 注解 @Mapping 注解用于定义源对象和目标对象之间的字段映射关系。你可以在 Mapper
    接口的方法上使用这个注解来指定具体的映射规则。
  • Mappings 注解 @Mappings 注解是 @Mapping 注解的容器,用于定义多个字段映射。
  • Component Model 通过 componentModel 属性,你可以指定生成的 Mapper 实现类的组件模型,例如Spring、CDI 或默认的无组件模型。

使用示例

  1. 定义源对象和目标对象
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
}
  1. 定义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);
}
  1. 主方法
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;@Autowiredpublic 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>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词