1. 问题场景
使用MpStruct映射类之间的字段,示例如下:
@Mapping(source="createBy" target="createBy")
public abstract PolicyScopeCreateCommand toPolicyScopeCreateCommand(String createBy, PolicyScopeDTO dto);
编译时提示:
MapStruct: Method has no source parameter named createBy. Method source parameters are "arg0, arg1,arg2"
2. 原因分析
该问题的原因是编译时生成的Class字节码文件中没有保留源码中的参数名,如下:
@Mapping(source="createBy" target="createBy")
public abstract PolicyScopeCreateCommand toPolicyScopeCreateCommand(String var1, PolicyScopeDTO var2);
3. 解决方案
jdk 1.8中新增了-parameters参数,配置-parameters参数后,编译的class文件中会保存源码中的参数名。配置方法如下:
3.1 IntelliJ Ideal中配置
3.2 Gradle配置
tasks.getByName("compileJava") {
options.compilerArgs << '-parameters'
}