2017-02-17 64 views
0

我写了使用这样的映射mapstruct映射:力mapstruct不叫有*方法

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

当我看到自动生成的mapstruct I类stubled在代码:

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

这对我来说是个问题,因为hasId()不是映射结构在这里期望的。我可以强制映射不知何故不生成使用此方法的代码,但检查id != null什么的?

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

回答

2

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

基本上这样做的唯一方法是提供一个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 

    } 

记住与文件META-INF-/services/com.example.MyAccessorNamingStrategy

注册您的SPI也有examples在那里你可以找到一个SPI的例子。