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

MapStruct nullValueMappingStrategy原语到bean返回默认bean而不是null值

车子平
2023-03-14

MapStruct版本:1.4.1.Final

当我试图将一个整数映射到bean时,当整数为空时,目标仍然被创建为默认对象而不是空

@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
public interface CompanyMapper { // NOSONAR

  CompanyMapper INSTANCE = Mappers.getMapper(CompanyMapper.class);

  @Mapping(source = "parentId", target = "parent.id")
  Company toEntity(RequestCompany request);

}

生成的代码

    @Override
    public Company toEntity(RequestCompany request) {
        if ( request == null ) {
            return null;
        }

        CompanyBuilder company = Company.builder();

        company.parent( requestCompanyToCompany( request ) );
        // Removed for simplicity

        return company.build();
    }
    
    protected Company requestCompanyToCompany(RequestCompany requestCompany) {
        if ( requestCompany == null ) {
            return null;
        }

        CompanyBuilder company = Company.builder();
        
        // Should verify if the parentId is null and 
        // return null if condition is met
        company.id( requestCompany.getParentId() );

        return company.build();
    }

编辑:与https://github.com/mapstruct/mapstruct/issues/1166#issuecomment-353742387

共有1个答案

姚臻
2023-03-14

这按预期工作。MapSTRt无法知道源对象的哪些属性需要被视为执行映射的关键属性。

为了实现你正在寻找的东西,你必须为它提供你自己的映射方法。

例如。

@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
public interface CompanyMapper { // NOSONAR

  default Company toEntity(RequestCompany request) {
    if (request == null || request.getParentId() == null) {
      return null;
    }

    return toEntity2(request);
  }
  
  @Named("ignoreForOtherMethods")
  @Mapping(source = "parentId", target = "parent.id")
  Company toEntity2(RequestCompany request);

}

注意:使用spring组件模型时,建议不要使用Mapper#getMapper

 类似资料:
  • 问题内容: 我的代码中有一个,如果地图的方法返回的是空列表而不是空值,则应避免使用空指针。java API中是否有类似的东西?我应该延长吗? 问题答案: @Jon的答案是直接处理您所要询问的好方法。 但是令我惊讶的是,您可能要实现的是“多图”;即从键到值集合的映射。如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类。 看着: 界面和它的实施方式中,或

  • 我在MySQL数据库中有一个表,其中包含一个默认值的列,在数据库端使用phpMyAdmin定义。当我使用HiberNate插入新行时,我得到这个错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“status”不能为null 我还需要做些什么来使用默认值吗? 实体

  • 我已经研究过这个问题:Spring3:注入默认Bean,除非存在另一个Bean,如果您知道所有Bean的名称,Java配置中显示的解决方案将很好地工作,但在我的情况下,我不知道Bean被称为什么。 有人知道有什么办法可以做到这一点吗?

  • 代码段用于获取从文本文件中提取的一行文本,将其分离为单独的标记,并将每个标记存储在数组的索引中。起初我以为问题出在文本文件上,但是直接将字符串放入编辑器并不能解决这个问题。 使用字符串,如: 带分隔符的StringTokenizer对象返回前四个标记作为正确的字符串,但其余四个标记为null。 有趣的是,另一个字符串: “Gnollnonegeralany222taunttaunt” 鸡肉没有野兽

  • 我对Liquibase有点陌生。我遇到了一个场景,在一个中,它试图首先添加默认值,而不是旁边的空约束。 但这里的问题是两者都

  • 这是我的代码,我不知道为什么我的bean没有被注入,它在构造函数中总是空的 下面是我的配置类: 我的堆栈跟踪 启动ApplicationContext时出错。若要显示自动配置报告,请在启用“debug”的情况下重新运行应用程序。11:55:29.139[restartedMain]错误O.S.Boot.SpringApplication-应用程序启动失败org.SpringFramework.Be