有没有办法使用MapStruct将空字符串映射到null?

问题描述 投票:0回答:4

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

有没有办法使用

@Mapping
将空字符串映射为 null?

java mapstruct
4个回答
20
投票

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

@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
限定符,并且不依赖于参数名称。


16
投票

您只需在 expression

 中使用 
@Mapping

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

2
投票

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

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

这会将任何

null
或空
String
源映射到
null


0
投票

您还可以使用文档建议的条件

@Mapper
public interface MyMapper {

     Target map( Source source);

     @Condition
     default boolean isNotEmpty(String value) {
        return value != null && !value.isEmpty();
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.