Mapstruct 映射布尔值到字符串

Mapstruct mapping Boolean to String

我的模型 class 中有几个 Boolean 字段(来源)。我的 DTO class 中的目标字段是 String。我需要将 true 映射为 Y 并将 false 映射为 N。有超过 20 个 Boolean 字段,现在我正在使用 20+ @Mapping 注释和 expression 选项,这是开销。必须有一种我不知道的简单方法或解决方案。谁能帮忙简化一下?

我正在使用 mapstruct 版本 1.2.0.Final

Source.java

class Source{
  private Boolean isNew;
  private Boolean anyRestriction;
  // several Boolean fields
}

Target.java

class Target{
  private String isNew;
  private String anyRestriction;
}

Helper.java

class Helper{
  public String asString(Boolean b){
    return b==null ? "N" : (b ? "Y" : "N");
  }
}

MyMapper.java

@Mapper interface MyMapper{
  @Mappings(
    @Mapping(target="isNew", expression="java(Helper.asString(s.isNew()))"
    // 20+ mapping like above, any simple way ? 
  )
  Target map(Source s);
}

如果我没记错的话,你只需要提供一个自定义类型转换的具体方法即可。
假设您仍在为 Mappers 使用抽象 类。

@Mapper
public abstract class YourMapper {
    @Mappings(...)
    public abstract Target sourceToTarget(final Source source);

    public String booleanToString(final Boolean bool) {
        return bool == null ? "N" : (bool ? "Y" : "N");
    }
}

即使使用 Java 8 个接口默认方法,这也应该是可能的。

类似于 Map Struct Reference#Invoking Other Mappers,您可以像这样定义(您的助手)class:

public class BooleanYNMapper {

    public String asString(Boolean bool) {
        return null == bool ?
            null : (bool ? 
                "Y" : "N"
            );
    }

    public Boolean asBoolean(String bool) {
        return null == bool ?
            null : (bool.trim().toLowerCase().startsWith("y") ?
                Boolean.TRUE : Boolean.FALSE
            );
    }
}

..然后在您的映射器(的层次结构)中使用它:

@Mapper(uses = BooleanYNMapper.class)
interface MyMapper{
    Target map(Source s);
    //and even this will work:
    Source mapBack(Target t);
}