@Builder на Ломбоке с Mapstruct переопределяет значения атрибута класса по умолчанию

В настоящее время мы реализуем реализацию 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. Есть идеи, как решить эту проблему? Большое спасибо за ваше время и помощь заранее.

MyEntity.MyEntityBuilder myEntity = myEntity.builder(); эта линия кажется мне немного странной. вы имели в виду MyEntity.builder(); ?

Stultuske 03.05.2024 14:25

Конечно, спасибо вам большое. Код был запутан вручную, извините.

naumb 03.05.2024 14:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
211
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение, позволяющее избежать использования 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 {

Другие вопросы по теме