Is there a way to map an empty String to null using MapStruct?
Solution 1:
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.
Solution 2:
You can simply use the expression
within the @Mapping
@Mapping(target = "name", expression = "java(source.name.isEmpty() ? null : source.name)")
Dog convert(Cat source);