代码之家  ›  专栏  ›  技术社区  ›  Sridhar

映射结构将布尔值映射到字符串

  •  2
  • Sridhar  · 技术社区  · 7 年前

    我有几个 Boolean 我的模型类(源)中的字段。我的DTO类中的目标字段是 String . 我需要地图 true 作为 Y false 作为 N . 有20多个 布尔 现在我用的是20+ @Mapping 用注释 expression 选项,这是开销。必须有一个我不知道的简单方法或解决方案。有人能帮助简化这个吗?

    我正在使用 mapstruct 版本 1.2.0.Final

    源代码

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

    Java.java

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

    爪哇爪哇

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

    爪哇爪哇

    @Mapper interface MyMapper{
      @Mappings(
        @Mapping(target="isNew", expression="java(Helper.asString(s.isNew()))"
        // 20+ mapping like above, any simple way ? 
      )
      Target map(Source s);
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   xerx593    7 年前

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

    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);
    }
    
        2
  •  3
  •   LppEdd    7 年前

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

    @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接口默认方法,这也是可能的。