【发布时间】:2022-08-15 02:14:24
【问题描述】:
This answer 描述了如何在 Mapstruct 中实现自定义访问器命名策略。在this example 中,命名策略大概适用于应用程序中的所有映射器。
有没有办法只配置 1 个映射器以使用自定义命名策略,并在所有剩余的映射器中保持默认?
This answer 描述了如何在 Mapstruct 中实现自定义访问器命名策略。在this example 中,命名策略大概适用于应用程序中的所有映射器。
有没有办法只配置 1 个映射器以使用自定义命名策略,并在所有剩余的映射器中保持默认?
如果您将其限制为将其用于一个 Mapper,则目前这是不可能的。然而,基于 Mapper 来限制它是没有意义的,如果你想从一个不可变数据结构映射到一个 java bean 数据结构怎么办。通常,该包可用于识别您是否要对此类使用策略 A 或策略 B。
您可以编写自己的自定义命名策略,根据方法所在的包/类在这些策略之间切换。
请参阅下面的自定义策略和默认策略之间切换的示例:
public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {
private static final String CUSTOM_PACKAGE = "custom"; // custom package name.
private Elements elementUtils;
@Override
public void init(MapStructProcessingEnvironment processingEnvironment) {
super.init( processingEnvironment );
elementUtils = processingEnvironment.getElementUtils();
}
@Override
public boolean isGetterMethod(ExecutableElement method) {
if ( isCustomPackage( method ) ) {
// handle custom route and return.
} else { // fallback to default
return super.isGetterMethod( method );
}
}
@Override
public boolean isSetterMethod(ExecutableElement method) {
if ( isCustomPackage( method ) ) {
// handle custom route and return.
} else { // fallback to default
return super.isSetterMethod( method );
}
}
@Override
public String getPropertyName(ExecutableElement getterOrSetterMethod) {
if ( isCustomPackage( method ) ) {
// handle custom route and return.
} else { // fallback to default
return super.getPropertyName( getterOrSetterMethod );
}
}
private boolean isCustomPackage(ExecutableElement method) {
return getPackage( method ).contains( "." + CUSTOM_PACKAGE + "." ) // subpackage
|| getPackage( method ).endsWith( "." + CUSTOM_PACKAGE ); // current package
}
private String getPackage(ExecutableElement element) {
return elementUtils.getPackageOf( element ).getQualifiedName().toString();
}
}
有关更多信息,另请参阅https://github.com/mapstruct/mapstruct/issues/2957(在询问此问题后创建)
【讨论】: