MapStruct 因特殊字段命名导致编译时找不到对应的字段,时好时坏
问题背景
在使用@Mapping做具体字段映射时,明明target的值与实体类中的字段一致,但就是报下面这种错
java: Unknown property "dBMSName" in result type DataBaseInfo. Did you mean "DBMSName"?
下面是示例实体类和@Mapping
lombok 1.18.4
mapstruct 1.5.5.Final
//实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataBaseInfo {
private String dBMSName;
private String dBMSVersion;
...
}
@Mapping(source = "task.taskName", target = "dBMSName")
根本原因
这个问题实际上与Java Bean规范有关,而非MapStruct的缺陷。根据Java Bean规范:
- 对于属性名第二个字母为大写的情况(如dBMSName),规范的getter方法应为getdBMSName(),而不是getDBMSName()
- MapStruct严格遵循这一规范来识别和映射属性
- 当使用Lombok工具生成代码时,默认采用简单首字母大写策略,如果工具生成的getter方法不符合规范,就会导致MapStruct无法识别该属性,建议配置Lombok遵循Bean规范
解决办法
- 按照提示把target的值改为 首字母大写的 DBMSName
- 规范实体类字段的命名,应该是 dbmsName 而不是 dBMSName,总之避免出现首字母小写且第二个字母大写的情况
总结
规范命名!!!
P.S 因为整个类都是复制过来,并要求不能改字段名,我只做个数据转换刚好就遇到了这个问题,为什么说时好时坏,因为我上午发现的这个问题,我下午一边写随笔一边又测了一下,改成 "dBMSName" 这种又可以了,但别的字段不行,mlgb的

浙公网安备 33010602011771号