Mapstruct 将布尔值映射到字符串

Sri*_*har 6 java string mapping boolean mapstruct

我的模型类中有几个Boolean字段(源)。我的 DTO 类中的目标字段是String. 我需要映射trueasYfalseas N。有超过 20 个Boolean字段,现在我正在使用 20 多个@Mapping带有expression选项的注释,这是开销。一定有一个我不知道的简单方法或解决方案。任何人都可以帮助简化这个吗?

我正在使用mapstruct版本1.2.0.Final

源码.java

class Source{
  private Boolean isNew;
  private Boolean anyRestriction;
  // several Boolean fields
}
Run Code Online (Sandbox Code Playgroud)

目标.java

class Target{
  private String isNew;
  private String anyRestriction;
}
Run Code Online (Sandbox Code Playgroud)

助手.java

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

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);
}
Run Code Online (Sandbox Code Playgroud)

xer*_*593 6

类似于Map Struct Reference#Invoking Other Mappers,您可以定义(您的 Helper)类,如下所示:

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
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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