MapStruct映射忽略无对应源属性字段报错问题求助
解决MapStruct映射时"Unknown property 'isFoo' in result type FooDto"的问题
嘿,这个问题我之前也碰到过,大概率是JavaBean属性命名规范和MapStruct的属性识别逻辑不匹配导致的,咱们一步步来排查:
核心原因:属性名和Getter/Setter的对应关系搞混了
MapStruct严格遵循JavaBean规范来识别属性,对于布尔类型的属性,这里有两种常见的命名场景:
场景1:FooDto的属性确实是isFoo
如果你的FooDto是这么定义的:
public class FooDto { // 和Foo对应的其他属性 private boolean isFoo; // Getter符合规范:布尔类型属性以is开头时,Getter直接用属性名 public boolean isFoo() { return isFoo; } // Setter也需要对应:set + 属性名(注意首字母大写) public void setIsFoo(boolean isFoo) { this.isFoo = isFoo; } }
这种情况下你的@Mapping(target = "isFoo", ignore = true)是正确的,但还是报错的话,大概率是编译缓存的问题——MapStruct是注解处理器,旧的生成代码可能没更新。试试清理Maven/Gradle的缓存,然后重新编译项目。
场景2:FooDto的属性其实是foo,只是Getter叫isFoo
这是更常见的错误!很多人会把Getter方法名当成属性名。比如FooDto的定义是这样的:
public class FooDto { // 和Foo对应的其他属性 private boolean foo; // 布尔类型属性的Getter可以用isXxx()格式,这时候属性名是foo,不是isFoo public boolean isFoo() { return foo; } // Setter对应属性名foo public void setFoo(boolean foo) { this.foo = foo; } }
这时MapStruct识别到的属性名是foo,而不是isFoo,所以你写target = "isFoo"就会提示找不到属性。这时候只需要把@Mapping里的target改成foo就行:
@Mapper public interface FooMapper { @Mappings({ @Mapping(target = "foo", ignore = true) }) FooDto doToDto(Foo foo); Foo dtoToDo(FooDto fooDto); }
额外注意:反向映射的处理
如果你在dtoToDo方法中,Foo类本身没有isFoo(或foo)属性,MapStruct默认会尝试映射所有FooDto的属性,这时候也会报错。所以最好给反向映射也加上忽略配置:
@Mapper public interface FooMapper { @Mapping(target = "foo", ignore = true) // 根据实际属性名调整 FooDto doToDto(Foo foo); @Mapping(target = "foo", ignore = true) // Foo类没有这个属性,所以忽略 Foo dtoToDo(FooDto fooDto); }
内容的提问来源于stack exchange,提问作者Denis Stephanov
相关产品推荐
相关产品推荐

