java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot MapStruct生成映射

SpringBoot使用MapStruct生成映射代码的示例详解

作者:鹏阿鹏

MapStruct 是一个用于 Java 的代码生成器,专门用于生成类型安全的 bean 映射代码,它通过注解处理器在编译时生成映射代码,从而避免了运行时的性能开销和潜在的错误,本文给大家介绍了SpringBoot使用MapStruct生成映射代码的示例,需要的朋友可以参考下

定义

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

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

相关概念

使用示例

  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
}
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生成映射的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文