Использование Jackson и Lombok в Java: решение проблемы
Быстрый ответ
Для корректной сериализации класса с применением Lombok и аннотации @Builder
, используйте @Jacksonized
. Это обеспечит совместимость с сериализацией через @JsonDeserialize
:
@Builder
@Jacksonized
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
class MyClass {
private String attribute;
}
Убедитесь, что все необходимые модули Jackson подключены к проекту, для корректной реализации возможностей Lombok 1.18.12+ и процесса десериализации.
Работа с неизменяемыми классами
Неизменяемые объекты
Для создания неизменяемых классов используйте комбинацию аннотаций: @Value
от Lombok и @JsonDeserialize
от Jackson:
@Value
@AllArgsConstructor
@JsonDeserialize(builder = ImmutableClass.ImmutableClassBuilder.class)
public class ImmutableClass {
String name;
int age;
}
Профессиональный совет: Используйте данную структуру для обеспечения гладкой интеграции.
Синхронизация строителя
Чтобы согласовать работу строителя Lombok и ожидания Jackson, используйте prefix
:
@Value
@Builder
@Jacksonized
@JsonDeserialize(builder = CustomizedBuilder.CustomizedBuilderBuilder.class)
public class CustomizedBuilder {
String description;
}
Упрощение действий строителя
С помощью lombok.config
упростите задачи Jackson, позволив им управлять конструкторами:
lombok.anyConstructor.addConstructorProperties=true
Внедрите детализированное конфигурирование!
Работа со строителями
Если вам необходимо работать с несколькими реализациями строителя, вы можете переопределить аннотацию так, чтобы она лучше соответствовала вашим требованиям:
@JacksonAnnotationsInside
@JsonPOJOBuilder(withPrefix = "")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CustomizedJacksonized {
}
Настройте Jackson по умолчанию для удобной работы
Лёгкость использования? Отлично!
Создайте экземпляр ObjectMapper
и настройте его таким образом, чтобы выделить сложную задачу для Jackson:
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
:
@Value
@RequiredArgsConstructor
public class FinalFieldsClass {
final String id;
final String name;
}
Упростите преобразование JSON
Для точного сопоставления JSON-атрибутов применяйте @JsonProperty
:
@Value
public class ExplicitMapping {
@JsonProperty("user_name")
String username;
@JsonProperty("user_age")
int age;
}
Визуализация
Представьте Lombok как искусного плотника 🔧, который создаёт детали из дерева, используя аннотации и автогенерацию кода.
Jackson, в свою очередь, – художник 🎨, которому требуются чёткие инструкции для создания своих шедевров на основе геттеров и сеттеров.
С помощью общего рисунка они могут работать совместно.
@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
:
@Value
@Builder
@Jacksonized
public class ConsistentModel {
String feature;
}
Пересеките финишную линию, проведя всестороннее тестирование
С помощью тестов убедитесь в правильности процессов сериализации и десериализации:
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);
}
}
Полезные материалы
- Jackson Annotations · FasterXML/jackson-annotations Wiki · GitHub – Тщательная документация по аннотациям Jackson.
- Stack Overflow: Delete directories recursively in Java – Советы по интеграции Jackson и Lombok.
- Maven Central Repository Search – Поиск последних модулей Jackson для вашего проекта.
- Stable feature list of Project Lombok – Полный список возможностей Lombok.
- GitHub – FasterXML/jackson: Main Portal page for the Jackson project – Главная страница проекта Jackson на GitHub.
- DZone: Lombok and Jackson – Подробное руководство по совместному использованию Jackson и Lombok.