【问题标题】:Mapstruct: Apply AccessorNamingStrategy To a Single MapperMapstruct:将 AccessorNamingStrategy 应用于单个映射器
【发布时间】:2022-08-15 02:14:24
【问题描述】:

This answer 描述了如何在 Mapstruct 中实现自定义访问器命名策略。在this example 中,命名策略大概适用于应用程序中的所有映射器。

有没有办法只配置 1 个映射器以使用自定义命名策略,并在所有剩余的映射器中保持默认?

    标签: java mapstruct


    【解决方案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(在询问此问题后创建)

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2020-08-02
      • 2018-07-09
      • 2021-08-03
      • 2018-04-13
      • 2020-09-12
      • 2021-02-17
      相关资源
      最近更新 更多