MapStruct Java Record跨包映射失败,生成非法空构造实现
Java Record跨包映射的MapStruct正确处理方案
问题根源
你遇到的问题是MapStruct未正确识别源和目标均为Java Record类型,错误尝试使用不存在的空构造器生成代码。核心原因是Mapper接口中类的引用不明确,或编译环境未满足Record的特性要求。
解决步骤
1. 明确Mapper中的类引用
确保Mapper接口中显式指定两个包下Kriterium类的全限定名,避免类名冲突导致MapStruct识别错误:
@Mapper public interface KriteriumMapper { KriteriumMapper INSTANCE = Mappers.getMapper(KriteriumMapper.class); // 显式标注源和目标类的完整包路径 de.model.Kriterium fromPersistenceRecord(de.persistence.model.nontransactional.Kriterium k); }
2. 显式声明字段映射(可选但推荐)
即使字段名完全一致,显式添加@Mapping注解可触发MapStruct正确识别Record的全参构造器:
@Mapper public interface KriteriumMapper { KriteriumMapper INSTANCE = Mappers.getMapper(KriteriumMapper.class); @Mapping(source = "name", target = "name") @Mapping(source = "crkSpaltenname", target = "crkSpaltenname") de.model.Kriterium fromPersistenceRecord(de.persistence.model.nontransactional.Kriterium k); }
3. 确保编译环境符合要求
Java Record是Java 16引入的特性,需保证编译时使用Java 16或更高版本,同时正确配置MapStruct注解处理器。以Maven为例:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <source>17</source> <!-- 最低要求为Java 16 --> <target>17</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
正确生成的代码示例
配置完成后,MapStruct会自动生成调用Record全参构造器的实现:
@Override public de.model.Kriterium fromPersistenceRecord(de.persistence.model.nontransactional.Kriterium k) { if ( k == null ) { return null; } return new de.model.Kriterium( k.name(), k.crkSpaltenname() ); }
内容的提问来源于stack exchange,提问作者Andreas Schouten
相关产品推荐
相关产品推荐

