Переходите к примерам здесь!
Проблемы
В современном стеке 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”