2

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

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

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

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

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

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

4

1 回答 1

4

是的,您可以强制 MapStruct 不使用这些presenceCheckers. 您可以在文档中的源存在检查中找到更多信息。

基本上,做到这一点的唯一方法是提供 MapStruct 的实现AccessorNamingStrategy。您可以扩展DefaultAccessorNamingStrategy并覆盖其isPresenceCheckMethod.

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

MyAccessorNamingStrategy extends DefaultAccessorNamingStrategy {

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

    }

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

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

于 2017-02-17T20:08:59.043 回答