强制 mapstruct 不调用 has* 方法

Force mapstruct not to call has* methods

我写了一个 mapstruct 映射器,它使用这样的映射:

@Mapping(target = "userId", source = "id.userId")

当我查看自动生成的 mapstruct class 时,我偶然发现了该代码:

if ( !foobar.hasId() ) {
    return null;
}

这对我来说是个问题,因为 hasId() 不是 mapstruct 在这里所期望的。我可以强制 mapstruct 以某种方式不生成使用此方法但检查 id != null 或其他内容的代码吗?

我可以使用像 @Mapping(target = "userId", expression= "java(...)") 这样的映射,但我认为应该有另一种方法。

是的,您可以强制 MapStruct 不使用那些 presenceCheckers。您可以在文档 source presence checking 中找到更多信息。

基本上唯一的方法是提供 MapStruct AccessorNamingStrategy. You can just extend the DefaultAccessorNamingStrategy 的实现并覆盖它的isPresenceCheckMethod.

您可以访问方法 ExecutableElement 并且您可以检查它所在的 class 的类型以及其他内容。

MyAccessorNamingStrategy extends DefaultAccessorNamingStrategy {

    @Override
    public boolean isPresenceCheckMethod(ExecutableElement element) {
        //You can do your checks here. You can ignore certain methods, from certain classes

    }

记得用文件注册你的 SPI META-INF-/services/com.example.MyAccessorNamingStrategy

还有 examples,您可以在其中找到 SPI 的示例。