В настоящее время мы реализуем реализацию Lombok в большом приложении, главным образом одним из преимуществ, которым мы хотим воспользоваться, является использование @Builder.
Для этого мы реализовали в Spring boot 3.2.4 версию Lombok 1.18.30 в сочетании с Mapstruct 1.5.5.Final и соответствующей зависимостью для их реализации lombok-mapstruct-binding:0.2.0.
Проблема, с которой мы сталкиваемся, связана с поколением картографов. Они перезаписывают значения инициализации атрибутов классов. Например:
@Column(name = "my_class_attribute",
columnDefinition = "double default 4250")
private double my_class_attribute = 4250;
Создаем картограф следующим образом:
@Override
public MyEntity toEntity(MyDataTransferObject source) {
if ( source == null ) {
return null;
}
MyEntity.MyEntityBuilder myEntity = MyEntity.builder();
Эта последняя строка myEntity.builder(); записывает настройки инициализации по умолчанию.
Поскольку мы являемся приложением со значительным объемом кода, мы не считаем удобным и действительно безопасным аннотировать с помощью @Builder.Default те атрибуты, которые имеют значение инициализации. Это привело бы к большой погрешности, которую невозможно было бы проверить во время компиляции.
Мы рассмотрели другие параметры, но не видим ни одного, который мог бы быть объявлен глобально, например, в файле конфигурации lombok.config. Есть идеи, как решить эту проблему? Большое спасибо за ваше время и помощь заранее.
Конечно, спасибо вам большое. Код был запутан вручную, извините.




Я нашел решение, позволяющее избежать использования Mapstruct сборщиков Lombok, которые переопределяют значения по умолчанию. Вы можете указать следующий атрибут builder = @Builder(disableBuilder = true), чтобы избежать использования Mapstruct внутри сборщиков.
Централизованная конфигурация будет выглядеть так
@MapperConfig(
componentModel = "spring",
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
unmappedTargetPolicy = ReportingPolicy.IGNORE,
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
builder = @Builder(disableBuilder = true)
)
public interface MapperCentralConfig {
}
И случай использования
@Mapper(config = MapperCentralConfig.class)
public interface MyDummyMapper {
MyEntity.MyEntityBuilder myEntity = myEntity.builder(); эта линия кажется мне немного странной. вы имели в виду MyEntity.builder(); ?