java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mapstruct @Mapper注解

mapstruct中的@Mapper注解的基本用法

作者:有梦想的攻城狮

在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍mapstruct中的@Mapper注解的相关知识,感兴趣的朋友一起看看吧

在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper)。MapStruct会在编译时自动生成该接口的实现类,完成对象之间的属性映射。以下是对@Mapper注解的详细解析:

1. 基本用法

@Mapper注解可以单独使用,也可以配合其他属性进行配置。以下是一个简单的示例:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    @Mapping(source = "username", target = "name")
    UserDTO toUserDTO(User user);
}

2. 常用属性

@Mapper注解支持多种属性,用于配置映射器的行为:

(1) componentModel

指定生成的映射器实现类的组件模型,便于与其他框架(如Spring、CDI)集成。

可选值default:默认模型,不依赖任何框架。

示例

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    // ...
}

(2) uses

指定其他映射器或工具类,用于在映射过程中调用。

示例

@Mapper(uses = {DateMapper.class})
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    // ...
}

(3) implementationNameimplementationPackage

示例

@Mapper(implementationName = "CustomUserMapperImpl", implementationPackage = "com.example.mappers")
public interface UserMapper {
    // ...
}

(4) unmappedTargetPolicy

指定当目标对象有未映射的属性时的处理策略。

可选值

示例

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper {
    // ...
}

(5) injectionStrategy

指定依赖注入的策略。

可选值

示例

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface UserMapper {
    // ...
}

3. 高级用法

(1) 结合@MapperConfig

可以通过@MapperConfig定义全局配置,然后在@Mapper中引用。

示例

@MapperConfig(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CommonMapperConfig {
}
@Mapper(config = CommonMapperConfig.class)
public interface UserMapper {
    // ...
}

(2) 自定义方法

可以在映射器接口中定义自定义方法,MapStruct会调用这些方法完成复杂的映射逻辑。

示例

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    @Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())")
    UserDTO toUserDTO(User user);
    default String formatDate(Date date) {
        // 自定义日期格式化逻辑
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }
}

4. 注意事项

依赖配置

映射规则

性能

5. 总结

@Mapper注解是MapStruct的核心,通过它可以:

通过合理使用@Mapper注解及其属性,可以大大简化对象之间的映射逻辑,提高开发效率和代码质量。

6. 编译异常处理

针对MapStruct项目编译异常问题,可从依赖配置、IDE设置、代码规范及版本兼容性四个维度进行排查和解决,以下是具体分析和建议:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.3.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.3.Final</version>
    <scope>provided</scope>
</dependency>
- **Gradle项目**:在`build.gradle`中添加:
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'

IDE设置问题

代码规范问题

@Mapper
public interface UserMapper {
    UserDto userToUserDto(User user);
}
- **检查属性映射**:如果源对象和目标对象的属性名不同,需要通过`@Mapping`注解显式指定,例如:
@Mapper
public interface UserMapper {
    @Mapping(source = "username", target = "name")
    UserDto userToUserDto(User user);
}

版本兼容性问题

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.6.0.Final</version>
</dependency>
- **解决Lombok冲突**:如果项目中同时使用Lombok和MapStruct,特别是使用Lombok的`@Builder`注解时,可能导致`@AfterMapping`不生效。对于Lombok版本1.18.16或更高版本,需添加`lombok-mapstruct-binding`依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-mapstruct-binding</artifactId>
    <version>0.2.0</version>
</dependency>

其他可能的问题及解决方案

@Mapper
public interface EnumConverter {
    default TargetEnum toTargetEnum(SourceEnum sourceEnum) {
        if (sourceEnum == null) {
            return null;
        }
        switch (sourceEnum) {
            case SOURCE_VALUE1:
                return TargetEnum.TARGET_VALUE1;
            case SOURCE_VALUE2:
                return TargetEnum.TARGET_VALUE2;
            default:
                throw new IllegalArgumentException("Unknown enum type: " + sourceEnum);
        }
    }
}

到此这篇关于mapstruct中的@Mapper注解的基本用法的文章就介绍到这了,更多相关mapstruct @Mapper注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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