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