com.fasterxml.jackson.databind.exc.InvalidDefinitionException: сериализатор для класса не найден при использовании lombok

#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, это мое лучшее предположение.