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

Mapstruct映射:如果所有源参数属性都为null,则返回null对象

皮承基
2023-03-14
@Mappings({
      @Mapping(target = "id", source = "tagRecord.tagId"),
      @Mapping(target = "label", source = "tagRecord.tagLabel")
})
Tag mapToBean(TagRecord tagRecord);
public Tag mapToBean(TagRecord tagRecord) {
    if ( tagRecord == null ) {
        return null;
    }

    Tag tag_ = new Tag();

    if ( tagRecord.getTagId() != null ) {
        tag_.setId( tagRecord.getTagId() );
    }
    if ( tagRecord.getTagLabel() != null ) {
        tag_.setLabel( tagRecord.getTagLabel() );
    }

    return tag_;
}

如果(tagrecord.gettagid()==null&&tagrecord.gettaglabel()==null),我实际上希望生成的方法返回一个null标记对象。有没有可能,我该如何实现这一点?

共有1个答案

许阿苏
2023-03-14

MapStruct目前不直接支持这一点。但是,您可以在修饰符的帮助下实现您想要的,并且您必须手动检查所有字段是否为空,并返回null而不是对象。

@Mapper
@DecoratedWith(TagMapperDecorator.class)
public interface TagMapper {
    @Mappings({
        @Mapping(target = "id", source = "tagId"),
        @Mapping(target = "label", source = "tagLabel")
    })
    Tag mapToBean(TagRecord tagRecord);
}


public abstract class TagMapperDecorator implements TagMapper {

    private final TagMapper delegate;

    public TagMapperDecorator(TagMapper delegate) {
        this.delegate = delegate;
    }

    @Override
    public Tag mapToBean(TagRecord tagRecord) {
        Tag tag = delegate.mapToBean( tagRecord);

        if (tag != null && tag.getId() == null && tag.getLabel() == null) {
            return null;
        } else {
            return tag;
        }
    }
}

我编写的示例(构造函数)是针对具有default组件模型的映射器的。如果您需要使用Spring或其他DI框架,请查看:

  • 带有Spring的装饰器
  • 使用JSR 330的装饰器
  • 如果使用CDI,则不应使用@decoratedwith,而应使用CDI装饰器
 类似资料:
  • 我找不到答案,我相信MapStruc不可能这样做。无论如何我想问一下,也许我错过了什么。 我有一个映射方法,它采用两个源并映射到一个目标,比方说 生成的代码执行以下检查以返回: 我希望 附注:我们使用MapStruct 1.3.1

  • 大家好! 我正在Spring应用程序中实现Mapstruct映射器。 有两个相关实体:和。只是为了简化->用户可以有许多订单。 OrderMapper类: 好吧,我的问题是: 如果我使用以下命令传递OrderDTO: 前面描述的情况在我的应用程序中造成了巨大的问题。如果有任何帮助,我将不胜感激。

  • 问题内容: 我有以下映射 我如何配置我的Mapper或Mappings,以便当childId为null时,将目标Entity.child设置为null而不是Entity.child.id? 问题答案: 对于我来说,找到的不是一个非常优雅的解决方案,而是可行的解决方案。 首先将接口更改为抽象类,然后添加

  • 默认情况下,MapStruct将NullValueMappingStrategy作为RETURN_NULL。我的要求是,当source为null时,我需要抛出一个NPE,类似于lombok的@nonnull的工作方式。

  • 我已经连接表与一个 新娘模型: 计划模型: 我有一个查询将这些数据返回到endpoint。 一切都很好,除了一件事。在婚宴桌上,一些身份证上没有计划。因此,当我返回数据时,一些带有一个空的数组。 我想阻止这种情况。如果没有计划,那么我不想返回该新娘id。在这里我如何才能实现我想要的?

  • 是否可以将此代码转换为Java8可选的单行表达式? i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0<代码>可选。不可数()。orElse()不适合,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。