Рубрики
Без рубрики

Лучшие практики использования Джексона и Ломбока

Переходите к примерам здесь! Проблемы В современном стеке Java Ломбок и Джексон являются самыми популярными… Помеченный java, качество кода.

Переходите к примерам здесь!

Проблемы

В современном стеке Java Ломбок и Джексон являются наиболее широко используемыми фреймворками, и, поскольку они помогают работать, у пользователей библиотеки может возникнуть множество вопросов и проблем.

По поисковому запросу StackOverflow задан 631 вопрос https://stackoverflow.com/search ?q=ломбок+Джексон на дату написания этой статьи.

Определенно, большая часть этого связана с конкретными проблемами, но все же огромная часть вопросов и ответов приводит к большому разнообразию примеров, использованию аннотаций. После чего разработчики распространили по репозиториям очень разные наборы аннотаций и конфигураций. Это приводит к отсутствию стандартов и лучших практик.

Ожидания

  • Аннотации одинаковы в разных случаях
  • Джексон сериализует и десериализует объекты:
    • изменчивый
    • неизменный
  • Джексон сериализует и десериализует объекты классов, ограниченных наследованием
  • Классы содержат как можно меньше аннотаций Джексона, чтобы они не зависели от фреймворка и были более чистыми

Реализация

Дело о наследовании
import lombok.RequiredArgsConstructor;
import lombok.Value;
import lombok.experimental.NonFinal;
import lombok.experimental.SuperBuilder;

@Value
@NonFinal
@SuperBuilder
@RequiredArgsConstructor
public class Card {
    String name;
    Status status;
    Balance balance;
}
import java.beans.ConstructorProperties;
import java.math.BigDecimal;

import lombok.EqualsAndHashCode;
import lombok.Value;
import lombok.experimental.SuperBuilder;

@Value
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public class CreditCard extends Card {
    BigDecimal rate;

    @ConstructorProperties({"name", "status", "balance", "rate"})
    public CreditCard(String name, Status status, Balance balance, BigDecimal rate) {
        super(name, status, balance);
        this.rate = rate;
    }
}

Проверка с помощью простых тестов:

@Test
    void itSerializes() throws Exception {
        CreditCard creditCard = CreditCard
                .builder()
                .name("The credit card")
                .rate(new BigDecimal("5.0"))
                .status(ACTIVE)
                .balance(Balance
                        .builder()
                        .id(1L)
                        .value(new BigDecimal("1000.0"))
                        .build())
                .build();

        String expectedJson = readFromFile("credit-card-serialize.json");

        String actualJson = objectMapper.writeValueAsString(creditCard);

        JSONAssert.assertEquals(expectedJson, actualJson, true);
    }

    @Test
    void itDeserializes() throws Exception {
        String inputJson = readFromFile("credit-card-deserialize.json");

        CreditCard actual = objectMapper.readValue(inputJson, CreditCard.class);

        assertEquals(new BigDecimal("5.0"), actual.getRate());
        assertEquals("The credit card", actual.getName());
        assertSame(ACTIVE, actual.getStatus());
        assertNotNull(actual.getBalance());
        assertEquals(1L, actual.getBalance().getId());
        assertEquals(new BigDecimal("1000.0"), actual.getBalance().getValue());
    }
Изменяемый с наследованием
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder
@NoArgsConstructor
public class Animal {
    private Long id;
    private String description;
}
@Data
@SuperBuilder
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Cat extends Animal {
    private Integer lives;
}

Выводы

Чтобы сохранить ваши объекты неизменными и наилучшим образом соответствовать Джексону, используйте аннотации:

  • ломбок. Ценность
  • ява.бобы. Свойства конструктора

Чтобы сохранить чистоту создания объектов в стиле DESI с явным отображением полей, используйте аннотации:

  • ломбок.экспериментальный. Супер Строитель как в родительских, так и в детских классах
CreditCard
  .builder()
  .rate(new BigDecimal("5.0"))
  .name("The credit card") //parent field
  .status(ACTIVE)
  .balance(Balance.builder()                         
           .id(1L)
           .value(new BigDecimal("1000.0"))                  
           .build())
  .build()

Я считаю, что использование стандартного набора аннотаций в вашем проекте упростит обслуживание. Уменьшение количества зависимостей, таких как аннотации Джексона, сделает его независимым от фреймворка, а простые тесты помогут вам проверить ожидаемое поведение без необходимости запускать дорогостоящие и медленные тесты.

Сосредоточиться на:

  • неизменность
  • тесты
  • единообразие

Проект GitHub с примерами

Оригинал: “https://dev.to/art_ptushkin/best-practices-on-using-jackson-and-lombok-2lpm”