定义
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生成映射的资料请关注代码网其它相关文章!
发表评论