Mapstruct, отображающий Boolean на String - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть несколько полей Boolean в моём классе модели (источник).Поле назначения в моем классе DTO - String.Мне нужно сопоставить true как Y и false как N.Имеется более 20 Boolean полей, и сейчас я использую аннотацию 20+ @Mapping с опцией expression, которая является дополнительной.Должен быть простой способ или решение, которого я не знаю.Кто-нибудь может помочь упростить это?

Я использую mapstruct версия 1.2.0.Final

Source.java

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

Target.java

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

Helper.java

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

MyMapper.java

@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 ]

0 голосов
/ 10 февраля 2019

Аналогично Ссылка на структуру карты # Вызов других картографов , вы можете определить (ваш Помощник) класс как:

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);
}
0 голосов
/ 10 февраля 2019

Если я правильно помню, вам просто нужно предоставить конкретный метод преобразования типов.
Допустим, вы все еще используете абстрактные классы для Mappers.

@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 по умолчанию.

...