【问题标题】:Is there a way to map an empty String to null using MapStruct?有没有办法使用 MapStruct 将空字符串映射到 null?
【发布时间】:2020-04-16 11:42:17
【问题描述】:

我在 Spring Boot 应用程序中使用 MapStruct 将 DTO 映射到实体,反之亦然。

有没有办法使用 @Mapping 将空字符串映射为 null?

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    可以使用another answer 中建议的表达式。我个人更喜欢这样做更安全一些,也许更具声明性。

    @Mapper
    public interface MyMapper {
    
        @Mapping( target = "s2",  qualifiedBy = EmptyStringToNull.class )
        Target map( Source source);
    
        @EmptyStringToNull
        default String emptyStringToNull(String s) {
            return s.isEmpty() ? null : s;
        }
    
        @Qualifier
        @java.lang.annotation.Target(ElementType.METHOD)
        @Retention(RetentionPolicy.CLASS)
        public @interface EmptyStringToNull {
        }
    
        class Source {
    
            private String s1;
            private String s2;
    
            public String getS1() {
                return s1;
            }
    
            public void setS1(String s1) {
                this.s1 = s1;
            }
    
            public String getS2() {
                return s2;
            }
    
            public void setS2(String s2) {
                this.s2 = s2;
            }
        }
    
        class Target {
    
            private String s1;
            private String s2;
    
            public String getS1() {
                return s1;
            }
    
            public void setS1(String s1) {
                this.s1 = s1;
            }
    
            public String getS2() {
                return s2;
            }
    
            public void setS2(String s2) {
                this.s2 = s2;
            }
        }
    }
    
    
    

    您可以根据需要多次重复使用EmptyStringToNull 限定符,并且不依赖于参数名称。

    【讨论】:

      【解决方案2】:

      您可以简单地在@Mapping 中使用expression

      @Mapping(target = "name", expression = "java(source.name.isEmpty() ? null : source.name)")
      Dog convert(Cat source);
      

      【讨论】:

      • 如果字段有私有访问权限,我们可以使用getter方法代替字段名。例如:@Mapping(target = "name", expression = "java(source.getName.isEmpty() ? null : source.getName)") Dog convert(Cat source);
      • 多么样板!
      【解决方案3】:

      如果您希望它在映射器类中全局工作并拦截任何字符串映射,您可以简单地实现以下内容:

      default String mapEmptyString(String string) {
       string != null && !string.isEmpty() ? string : null;
      }
      

      这会将任何null 或空String 源映射到null

      【讨论】:

      • 你确定这行得通吗?
      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2018-02-11
      • 2019-07-03
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多