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规范:

  1. 对于属性名第二个字母为大写的情况(如dBMSName),规范的getter方法应为getdBMSName(),而不是getDBMSName()
  2. MapStruct严格遵循这一规范来识别和映射属性
  3. 当使用Lombok工具生成代码时,默认采用简单首字母大写策略,如果工具生成的getter方法不符合规范,就会导致MapStruct无法识别该属性,建议配置Lombok遵循Bean规范

解决办法

  1. 按照提示把target的值改为 首字母大写的 DBMSName
  2. 规范实体类字段的命名,应该是 dbmsName 而不是 dBMSName,总之避免出现首字母小写且第二个字母大写的情况

总结

规范命名!!!

P.S 因为整个类都是复制过来,并要求不能改字段名,我只做个数据转换刚好就遇到了这个问题,为什么说时好时坏,因为我上午发现的这个问题,我下午一边写随笔一边又测了一下,改成 "dBMSName" 这种又可以了,但别的字段不行,mlgb的

posted @ 2025-06-20 15:54  不睡觉的狗子  阅读(82)  评论(0)    收藏  举报