如何配置MapStruct使其基于@JsonProperty注解完成字段映射
MapStruct基于@JsonProperty注解自动映射的实现方法
是可以实现的,MapStruct从1.5版本开始原生支持读取Jackson的@JsonProperty注解值作为字段映射的匹配依据,不需要手动为每个差异字段编写@Mapping声明,只要调整编译配置即可。
配置方式
根据你使用的构建工具选择对应配置:
- Maven配置:在
maven-compiler-plugin的编译参数中添加注解处理器配置,示例如下:
<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.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> <path> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.15.2</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-Amapstruct.accessor_naming_strategy=jackson</arg> <arg>-Amapstruct.experimental.synthetic_provider_method_names=true</arg> </compilerArgs> </configuration> </plugin>
- Gradle配置:在
build.gradle的编译参数中添加如下配置:
compileJava { options.compilerArgs += [ '-Amapstruct.accessor_naming_strategy=jackson', '-Amapstruct.experimental.synthetic_provider_method_names=true' ] }
验证效果
配置完成后,你给出的示例代码不需要额外编写字段映射规则,直接定义Mapper接口即可自动完成映射:
@Mapper public interface AuftragMapper { AuftragMapper INSTANCE = Mappers.getMapper(AuftragMapper.class); OrderDto convertToDto(Auftrag auftrag); }
编译后生成的实现类会自动将Auftrag类的auftragsart字段值赋值给OrderDto的orderType字段。
注意事项
- 必须使用1.5及以上版本的MapStruct,低版本无该特性支持
@JsonProperty注解标注在字段、getter方法、setter方法上均可被识别- 如果同时存在手动配置的
@Mapping注解,手动配置的优先级高于注解自动匹配
内容的提问来源于stack exchange,提问作者Sven Nagel
相关产品推荐
相关产品推荐

