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