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

MapStruct中的自定义源存在检查方法名称

须巴英
2023-03-14

是否可以生成自定义的“存在检查”方法名称,作为属性本身的方法而不是拥有对象?

我知道我可以使用hasProperty()方法来检查值的存在...https://map struct . org/documentation/stable/reference/html/# source-presence-check

但是对于Optional或JsonNullable(来自OpenApi nonullable ),检查方法是在属性本身上,而不是在拥有对象上...:-(

我可以简单地“使用”或扩展一个简单的自定义映射器来映射JsonNullable或Optional

@Mapper
public class JsonNullableMapper {

    public <T> T fromJsonNullable(final JsonNullable<T> jsonNullable) {
        return jsonNullable.orElse(null);
    }

    public <T> JsonNullable<T> asJsonNullable(final T nullable) {
        return nullable != null ? JsonNullable.of(nullable) : JsonNullable.undefined();
    }

}

我想实现的是这样的“存在检查”:

if(source.getProperty().isPresent()) {
    target.set(customMapper.map(source.getProperty()));
}

有人找到解决办法了吗?

感谢和问候

共有2个答案

魏勇军
2023-03-14

不幸的是,答案是直接否定的。

这在当前版本的MapStruct(1.3.1final)中是不可能的,它不在1.4.0的候选名单上。您可以在MapStruct的git存储库上提出问题作为功能请求。

阎承嗣
2023-03-14

我已经设法实现了自定义龙目岛扩展,它生成了“状态检查”方法。

下面是一个示例项目。简而言之,我添加了@PresenceChecker注释并实现了Lombok Javac注释处理程序。

可以将它与其他Lombok注释一起使用:

@Getter
@Setter
public class User {
    private String name;
}

@Getter
@Setter
@PresenceChecker
public class UserUpdateDto {
    private String name;
}

//MapStruct Mapper interface declaration
@Mapper
public interface UserMapper {
    void updateUser(UserUpdateDto dto, @MappingTarget User user);
}

生成的代码

public class User {
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class UserUpdateDto {
    private boolean hasName;
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
        this.hasName = true;
    }

    public boolean hasName() {
        return this.hasName;
    }
}

//MapStruct Mapper implementation
public class UserMapperImpl implements UserMapper {
    @Override
    public void updateUser(UserUpdateDto dto, User user) {
        if ( dto == null ) {
            return;
        }

        if ( dto.hasName() ) {
            user.setName( dto.getName() );
        }
    }
}
 类似资料:
  • 问题内容: 我有带有文本框用户名的注册表。我要做的是,当用户输入用户名时,自定义指令将检查输入的用户名是否存在于数据库中。 指令.js 如果存在,我将在html表单中显示标签“用户名已存在”。 registration.html 但是现在,他们不能正常工作:-(,我在做对吗? 问题答案: yearofmoo提供 了一个很棒的教程, 介绍 有关angular1.3中的$ asyncvalidator

  • 我一直在查看MapStruct文档,但没有成功。 我正在实现我的域类和我的DTO类之间的映射;使用MapSTRt。在我的域中,我不想对我的字段使用设置器,因为我们知道今天的设置器不好(出于许多原因,但这不是我问题的主题)。 但是当我想将转换为时,我收到了以下消息: 但是,我的类Item有一个业务方法void changeName(String newName),我想在映射器中使用它。 我的映射器的

  • 本文向大家介绍在Mybatis中使用自定义缓存ehcache的方法,包括了在Mybatis中使用自定义缓存ehcache的方法的使用技巧和注意事项,需要的朋友参考一下 自定义缓存 - ehcache Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器 1.导包 2.在 Mapper.xml 中指定使用 ehcache 缓存实现 3.在resource

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我正在尝试将添加到 Devise,但是当我注册一个新用户时,当我推送提交时它会中断。 我已确保运行< code>rake db:migrate并重新启动了我的服务器,但我得到了以下错误: ActiveRecord::StatementInvalid in Devise::RegistrationsController#create NoMethodError: nil:NilClass 的未定义方