10

I am using MapStruct for mapping a DTO to an entity and vice versa in my Spring Boot application.

Is there a way to map empty strings to null using @Mapping?

M. Justin
  • 14,487
  • 7
  • 91
  • 130
Saurabh Gupta
  • 315
  • 1
  • 5
  • 14

3 Answers3

20

Using an expression, as suggested in another answer, is possible. I personally prefer to do this a bit safer, and perhaps a bit more declarative.

@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;
        }
    }
}


You can re-use the EmptyStringToNull qualifier as many times as you'd like and your not dependent on the parameter name.

M. Justin
  • 14,487
  • 7
  • 91
  • 130
Sjaak
  • 3,602
  • 17
  • 29
12

You can simply use the expression within the @Mapping

@Mapping(target = "name", expression = "java(source.name.isEmpty() ? null : source.name)")
Dog convert(Cat source);
Daniel Taub
  • 5,133
  • 7
  • 42
  • 72
  • If the field has a private access, we may use the getter method in place of the field name. Eg: @Mapping(target = "name", expression = "java(source.getName.isEmpty() ? null : source.getName)") Dog convert(Cat source); – Sabu Shakya Nov 25 '21 at 04:40
  • 1
    What a boilerplate! – wonsuc Apr 18 '22 at 05:46
2

If you would like it to work globally in the mapper class and intercept any String-Mappings you can simply implement the following:

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

This will map any null or empty String source to null.

ouflak
  • 2,458
  • 10
  • 44
  • 49
Michael
  • 53
  • 5