Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Использование Jackson и Lombok в Java: решение проблемы

Быстрый ответ

Для корректной сериализации класса с применением Lombok и аннотации @Builder, используйте @Jacksonized. Это обеспечит совместимость с сериализацией через @JsonDeserialize:

Java
Скопировать код
@Builder
@Jacksonized
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
class MyClass {
    private String attribute;
}

Убедитесь, что все необходимые модули Jackson подключены к проекту, для корректной реализации возможностей Lombok 1.18.12+ и процесса десериализации.

Кинга Идем в IT: пошаговый план для смены профессии

Работа с неизменяемыми классами

Неизменяемые объекты

Для создания неизменяемых классов используйте комбинацию аннотаций: @Value от Lombok и @JsonDeserialize от Jackson:

Java
Скопировать код
@Value
@AllArgsConstructor
@JsonDeserialize(builder = ImmutableClass.ImmutableClassBuilder.class)
public class ImmutableClass {
    String name;
    int age;
}

Профессиональный совет: Используйте данную структуру для обеспечения гладкой интеграции.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Синхронизация строителя

Чтобы согласовать работу строителя Lombok и ожидания Jackson, используйте prefix:

Java
Скопировать код
@Value
@Builder
@Jacksonized
@JsonDeserialize(builder = CustomizedBuilder.CustomizedBuilderBuilder.class)
public class CustomizedBuilder {
    String description;
}

Упрощение действий строителя

С помощью lombok.config упростите задачи Jackson, позволив им управлять конструкторами:

lombok.anyConstructor.addConstructorProperties=true

Внедрите детализированное конфигурирование!

Работа со строителями

Если вам необходимо работать с несколькими реализациями строителя, вы можете переопределить аннотацию так, чтобы она лучше соответствовала вашим требованиям:

Java
Скопировать код
@JacksonAnnotationsInside
@JsonPOJOBuilder(withPrefix = "")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CustomizedJacksonized {
}

Настройте Jackson по умолчанию для удобной работы

Лёгкость использования? Отлично!

Создайте экземпляр ObjectMapper и настройте его таким образом, чтобы выделить сложную задачу для Jackson:

Java
Скопировать код
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
    @Override
    public String findPOJOBuilderConfig(AnnotatedClass ac) {
        JsonPOJOBuilder.Value defaultConfig = super.findPOJOBuilderConfig(ac);
        return defaultConfig == null ? "" : defaultConfig.withPrefix();
    }
});

Всё вновь о неизменяемости!

При создании неизменяемых классов с final полями не забывайте использовать @RequiredArgsConstructor:

Java
Скопировать код
@Value
@RequiredArgsConstructor
public class FinalFieldsClass {
    final String id;
    final String name;
}

Упростите преобразование JSON

Для точного сопоставления JSON-атрибутов применяйте @JsonProperty:

Java
Скопировать код
@Value
public class ExplicitMapping {
    @JsonProperty("user_name")
    String username;

    @JsonProperty("user_age")
    int age;
}

Визуализация

Представьте Lombok как искусного плотника 🔧, который создаёт детали из дерева, используя аннотации и автогенерацию кода.

Jackson, в свою очередь, – художник 🎨, которому требуются чёткие инструкции для создания своих шедевров на основе геттеров и сеттеров.

С помощью общего рисунка они могут работать совместно.

Java
Скопировать код
@Data // Lombok: Все детали готовы!
public class Chair {
    private String material;
    private int legs;

    // Jackson: Я вижу чертежи, приступаю к работе!
    public String getMaterial() { return material; }
    public int getLegs() { return legs; }
}

Согласованность – залог успеха

Откройте путь строителям с Jacksonized!

Для гармоничного процесса сериализации и десериализации сочетайте в себе @Jacksonized, @Builder и @Value:

Java
Скопировать код
@Value
@Builder
@Jacksonized
public class ConsistentModel {
    String feature;
}

Пересеките финишную линию, проведя всестороннее тестирование

С помощью тестов убедитесь в правильности процессов сериализации и десериализации:

Java
Скопировать код
class SerializationTest {
    @Test
    public void whenSerializeAndDeserialize_thenCorrect() {
        ConsistentModel model = new ConsistentModel("test");
        ObjectMapper mapper = new ObjectMapper();

        String serialized = mapper.writeValueAsString(model);
        ConsistentModel deserialized = mapper.readValue(serialized, ConsistentModel.class);
        
        assertEquals(model, deserialized);
    }
}

Полезные материалы

  1. Jackson Annotations · FasterXML/jackson-annotations Wiki · GitHub – Тщательная документация по аннотациям Jackson.
  2. Stack Overflow: Delete directories recursively in Java – Советы по интеграции Jackson и Lombok.
  3. Maven Central Repository Search – Поиск последних модулей Jackson для вашего проекта.
  4. Stable feature list of Project Lombok – Полный список возможностей Lombok.
  5. GitHub – FasterXML/jackson: Main Portal page for the Jackson project – Главная страница проекта Jackson на GitHub.
  6. DZone: Lombok and Jackson – Подробное руководство по совместному использованию Jackson и Lombok.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какая аннотация нужна для корректной сериализации класса с использованием Lombok и @Builder?
1 / 5
Свежие материалы