在MapStruct中使用的自定义设置器

问题描述 投票:0回答:1

我一直在浏览MapStruct documentation,但没有成功。

我正在实现我的Domain类和DTO类之间的映射;使用MapStruct。在我的域中,我不想在我的字段中使用设置器,因为我们知道今天设置器很糟糕(出于许多原因,但这不是我的问题)。

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

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

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

我的映射器的代码是:

@Mapper
public interface MyMapper {

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

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

感谢您的帮助。

java domain-driven-design mapstruct
1个回答
0
投票

为了实现类似的功能,您必须编写自己的自定义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。>

© www.soinside.com 2019 - 2024. All rights reserved.