强制 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 的示例。
我写了一个 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 的示例。