我正在评估ModelMapper 库以映射项目 DTO 和实体。尽管该库非常强大,但我找不到将实体上的硬编码值映射到其 DTO 表示的方法。
ModelMapper 将源类的方法映射到目标类的方法。例如:
modelMapper.createTypeMap(MyEntity.class, MyDTO.class)
.addMappings(mapper -> mapper.map(MyEntity::getName, MyDTO::setFirstName))
.addMappings(mapper -> mapper.map(MyEntity::getSurname, MyDTO::setLastName))
但是我在 DTO 上有一个属性,它还没有出现在实体方面。使用 Spring 转换器类,此映射始终由像这样的硬编码值完成dto.setStatus("ACTIVE");
。但是使用 ModelMapper 我无法弄清楚如何正确地做到这一点。我的第一次尝试是这样的:
.addMappings(mapper -> mapper.map(s -> {return "ACTIVE";}, MyDTO::setStatus))
但是,上面的映射不起作用,因为 ModelMapper 期望get
从源映射方法。因此,返回没有任何效果,实际上上面的代码会导致运行时错误。
一个非常丑陋的可能解决方案是使用这样的using
助手强制获得所需的结果:
addMappings(mapper -> mapper.using(c -> "ACTIVE").map(MyEntity::getName, MyDTO::setStatus));
在这种情况下,该getName
方法仅用于提供get
方法,而实际值将替换为ACTIVE
。但由于这是一个不清楚的解决方案,我想了解是否有更好的解决方案来使用 ModelMapper解决这个问题。
另一个解决方案是添加到我的 entity/dto a method public String getStatus() { return "ACTIVE"; }
。但我真的很想将所有硬编码值保留在映射器上。