Я хочу отобразить поле из Source
в Target
класс, и если исходное значение равно null
, я хотел бы преобразовать его в значение по умолчанию на основе типа данных ("" для строк, 0 для цифры c и т. д. c.). Для установки значений я использую не обычные сеттеры, а компоновщик (с protobuf , поэтому имена методов - newBuilder()
и build()
).
class Source {
private final String value; // getter
}
class Target {
private final String value;
public static Builder newBuilder() {return new Builder()}
public static class Builder {
public static setValue() {/*Set the field*/}
public static Target build() {/*Return the constructed instance*/}
}
My mapper выглядит следующим образом:
@Mapper(
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT,
nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT
)
public interface TargetMapper {
Target map(Source source);
}
Сгенерированная реализация mapper с этим кодом вызывает target.setValue(source.getValue())
вместо выполнения нулевой проверки и установки значения по умолчанию, если источник возвращает null
. Интересная часть заключается в том, что когда я добавляю следующую аннотацию к методу map
, в реализации присутствует пустая проверка.
@Mapping(source="value", target="value", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
Это ошибка в MapStruct со сборщиками или я пропустил некоторую конфигурацию чтобы можно было установить нулевое сопоставление в качестве политики по умолчанию, вместо того, чтобы дублировать его на всех сопоставлениях полей?
РЕДАКТИРОВАТЬ: По какой-то причине добавление nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
к аннотации @Mapper
уровня класса добавляет проверку нуля , но явно не устанавливает значение, просто пропускает вызов setValue
. Для protobuf это нормально, поскольку эта функциональность есть в библиотеке, но для других реализаций поле останется нулевым.