当前位置: 首页 > 知识库问答 >
问题:

要在MapStruct中使用的自定义setter

柴宏阔
2023-03-14

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

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

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

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

但是,我的类Item有一个业务方法void changeName(String newName),我想在映射器中使用它。

我的映射器的代码是:

@Mapper
public interface MyMapper {

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

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

谢谢你的帮助。

共有1个答案

狄冠宇
2023-03-14

为了实现类似的功能,您必须编写自己的自定义访问策略。

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

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文档中找到。

 类似资料:
  • 是否可以生成自定义的“存在检查”方法名称,作为属性本身的方法而不是拥有对象? 我知道我可以使用hasProperty()方法来检查值的存在...https://map struct . org/documentation/stable/reference/html/# source-presence-check 但是对于Optional或JsonNullable(来自OpenApi nonulla

  • 解决方案: 我不得不更改我的和的顺序。 我必须将放在之上,然后它就起作用了。 我将下面的pom更新到工作版本,所以这里没有非工作代码。 我还将lombok版本转换回当前版本,而不是使用edge版本。 原始问题: 我有2个或多或少相同的类集(见下面的示例) 一组是我的API的DTO,我希望它是不可变的,使用Lombok的@Value和@Builder 一组是要存储在数据库中的实体。使用Lombok的

  • 我有以下DTO类: VTypeDao看起来是这样的: 我的问题是:如何实例化VTypeDao的对象(或者至少是VTypeRepo,这样我就可以将if作为参数传递给VTypeDaoImpl)? 没有工厂类来获得VTypeDao的适当实现。 编辑:VTypeDao及其实现是我的项目的第三方组件。

  • 问题内容: 我正在尝试在使用wkhtmltopdf生成的PDF中使用自定义字体。我读到您不能使用google webfonts,而wkhtmltopdf使用truetype .ttf文件。谁能确认?因此,我从Google webfont下载了一个.ttf文件,并将其放入服务器中,然后使用了字体: 和字体系列: 现在应该以Jolly Lodger字体呈现的文本根本没有出现,页面为空白。 我究竟做错了

  • 问题内容: 我有一个.bmp图像,我想将其用作GUI的光标。该QCursor文件表明,这是可能的(“要创建自己的位图光标,要么使用QCursor构造函数需要一个位图和一个口罩或需要一个像素图作为参数构造函数”),但我似乎无法得到它在我收到’TypeError:QCursor():当我尝试将建议的模块与位图一起使用时,参数1具有意外的类型’str’时起作用。应该怎么做? 下面是产生上述错误的代码。该

  • 我正在编写一个代码,它取两个点,确定两个点的大小,比较它们,并返回哪个更大。我有我的主类和方法来运行所有的东西,然后还有另一个类点来实现我的接口。但是,我无法使从接口调用的方法正常工作。我的代码是: 当我尝试运行它时,我得到错误“exception in thread”main“java.lang.nullPointerException:不能调用”point.getMetality()“,因为”