【问题标题】:Custom setter to be used in MapStruct在 MapStruct 中使用的自定义设置器
【发布时间】:2020-04-20 15:14:08
【问题描述】:

我一直在查看MapStruct documentation,但没有成功。

我正在实现我的域类和我的 DTO 类之间的映射;使用 MapStruct。在我的领域中,我不想在我的领域中使用 Setter,因为我们知道今天 Setter 很糟糕(有很多原因,但这不是我的问题的主题)。

但是,当我想将 ItemDto 转换为 Item 时,我收到以下消息:

Error:(17, 21) java: Property "name" has no write accessor in my.example.Item.

但是我的班级 Item 有一个业务方法 void changeName(String newName) 我想在我的 Mapper 中使用。

我的 Mapper 的代码是:

@Mapper
public interface MyMapper {

    @Mapping(source="nameDto", target = "name")
    Item map(ItemDto dto);
}

我的问题很简单:如何指定 StructMap 以使用changeName 作为写访问器?

感谢您的帮助。

【问题讨论】:

    标签: java domain-driven-design mapstruct


    【解决方案1】:

    为了实现类似的功能,您必须编写自己的自定义 AccessorNamingStrategy

    如果您的域对象遵循相同的模式changeXXX,那么一个简单的实现可能如下所示:

    public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {
    
    
        @Override
        public boolean isSetterMethod(ExecutableElement method) {
            String methodName = method.getSimpleName().toString();
            return methodName.startsWith( "change" ) && methodName.length() > 6;
        }
    
        @Override
        public String getPropertyName(ExecutableElement getterOrSetterMethod) {
            String methodName = getterOrSetterMethod.getSimpleName().toString();
            if ( methodName.startsWith( "change") {
                return IntrospectorUtils.decapitalize( methodName.substring( 6 );
            }
            return super.getPropertyName( getterOrSetterMethod );
        }
    }
    
    

    您当然可以调整CustomAccessorNamingStrategy 以满足您的需求。请记住,这将用于所有对象。还有ItemDto

    关于它的更多信息可以在 MapStruct 文档中找到here

    【讨论】:

    • 这个解决方案有效,但在我看来并不是很可靠。它映射到 setter 方法的名称上,每当我重构 setter 方法时,我的编译器都不会注意到这一点。无论如何,非常感谢您接受我的回答,即使我不打算实施。
    • 你的意思是编译器不会注意到这一点?它基于您的代码中可能存在的特定模式。如果您忘记映射某些内容或在Mapping#target中使用未知属性,MapStruct 可能会出现编译错误@
    猜你喜欢
    • 2021-10-27
    • 2020-10-04
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2021-07-20
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多