#java #jackson
#java #jackson
Вопрос:
Странная проблема, возникающая при использовании @Data
и @NoArgsConstructor
из Project Lombok в DTO. Похоже, Джексон не может сериализовать и десериализовать классы с аннотациями lombok.
Я немного новичок в Lombok, но я ожидал, что библиотека будет генерировать методы получения и установки, поэтому Jackson сможет сериализовать и десериализовать объекты.
Короткий пример:
GetAllCustomersResponse.java
@Data
@NoArgsConstructor
public class GetAllCustomersResponse {
@JsonValue
private List<GetAllCustomersResponseElement> customers = new ArrayList<>();
public void addElement(GetAllCustomersResponseElement element) {
this.customers.add(element);
}
}
GetAllCustomersResponseElement.java
@Data
@NoArgsConstructor
public class GetAllCustomersResponseElement {
private Integer id;
private String name;
private Date birthdate;
}
Когда поступает запрос на извлечение GetAllCustomersResponse
(список со всеми клиентами), это исключение возникает во время сериализации Jackson:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.dto.GetAllCustomersResponseElement and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.example.dto.GetAllCustomersResponse["customers"]->java.util.ArrayList[0])
AFAIK, ‘Сериализатор для класса не найден’ обычно происходит, когда средства получения и установки не существуют в классе, который мы хотим сериализовать.
Если я напишу все «шаблонные» методы получения и установки, Jackson будет работать должным образом.
Но, если я использую @Data
из Lombok, почему для Jackson нет доступных методов получения и настройки?
Из Lombok docs:
@Data
Теперь все вместе: ярлык для
@ToString
,@EqualsAndHashCode
,@Getter
для всех полей,@Setter
для всех полей, не являющихся окончательными, и@RequiredArgsConstructor
!
Я что-то упускаю?
Комментарии:
1. Попробуйте включить
@AllArgsConstructor
.2. это сработало, большое спасибо .. но как это сработало?
3. Я думаю, что Джексон использует конструктор для сопоставления, если для полей не установлены аннотации сопоставления Джексона. Не глядя на фактический исходный код Jackson, это мое лучшее предположение.