mapstruct引入不生效:解决mapstruct与lombok二者版本冲突问题

本文介绍了在使用MapStruct时,遇到实体类无get/set方法的情况,发现是版本不匹配导致的。通过升级Maven编译器和调整版本,解决了这个问题。同时提供了Maven配置示例,确保了Lombok和MapStruct的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

引入了mapstruct的依赖,但是转换器的实现类中,并没有该实体的get/set方法进行属性赋值。

在这里插入图片描述

解决:

版本问题,mapstruct、lombok、maven的版本不对劲。

mapstruct 使用1.2.0

lombok使用1.16.22

是可行的。
在这里插入图片描述

或者在pom文件中加入这样一段:

升高maven-compiler-plugin的版本,同样可以解决问题。

	<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.16</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

最终效果:

在这里插入图片描述

### MapStruct 失效的原因分析 当遇到 `@AfterMapping` 注解不生效的情况时,通常涉及多个潜在因素。以下是详细的失效原因及其对应的解决方案。 #### LombokMapStruct 的兼容性问题 如果项目中同时使用了 LombokMapStruct,则可能会出现两者之间的冲突。特别是当使用 Lombok 的 `@Builder` 注解时,可能导致 `@AfterMapping` 不生效[^1]。为了确保两者的正常协作,在某些情况下需要引入额外的依赖项来解决这一问题: 对于 Lombok 版本 1.18.16 或更高版本,需添加 `lombok-mapstruct-binding` 来保证二者能够协同工作[^4]。 ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency> ``` #### 编译问题 另一个常见的原因是编译过程中出现问题。这可能是由于 IDE 设置不当或 Maven/Gradle 构建配置错误引起的。建议清理并重新构建整个工程以确认是否存在此类问题[^3]。 #### 方法签名一致性 还需注意方法签名的一致性。确保自定义的方法名默认生成的方法相匹配,并且参数列表也保持一致。如果不符,可能造成回调函数无法正确触发。 #### Getter 和 Setter 存在否 源对象应具备相应的 getter 方法以便于取值操作;而目标对象则应当拥有 setter 方法用于设置属性值。若未提供这些访问器方法(例如忘记加上 Lombok 提供的 `@Data` 注解),同样会引发映射失败的问题[^5]。 ### 解决方案示例 针对上述提到的各种可能性,下面给出具体的修复措施: ##### 方案一:调整注解顺序 尝试改变 `@Mapper` 及其他相关注解的位置,使其位于类声明之前而不是接口内部。这样做有助于避免一些特定环境下可能出现的解析异常。 ##### 方案二:升级库版本 确保所使用的 MapStructLombok 库均为最新稳定版。较新的发行版往往包含了更多改进和支持特性,能更好地适应现代 Java 开发环境的需求。 ```java // Example of proper setup with latest versions import org.mapstruct.Mapper; import lombok.Builder; @Mapper(componentModel = "spring") // Place this annotation at the class level instead inside interface public abstract class MyEntityMapper { @Mappings({ @Mapping(target = "targetField", source = "sourceField"), }) public abstract TargetClass toTarget(SourceClass source); @AfterMapping protected void afterMapping(@MappingTarget final TargetClass target, final SourceClass source) { // Custom logic here... } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值