Ошибка десериализации Джексона: MismatchedInputException - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующий класс

public class Cart {
    private final String id;

    public Cart(String id) { this.id = id;}

    public String getId() { return id; }
}

И следующий тест:

    String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    assertThat(cart.getId()).isEqualTo("56c7b5f7-115b-4cb9-9658-acb7b849d5d5");

И я получаю следующую ошибку:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Невозможно создать экземпляр com.store.domain.model.Cart (хотя существует хотя бы один создатель): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств) в [Source: (String) "{ "идентификатор": "56c7b5f7-115b-4cb9-9658-acb7b849d5d5"} ";строка: 1, столбец: 2]

Я не могу понять, что здесь не так.Любая помощь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Вам нужно определить ваш bean-компонент следующим образом:

public class Cart {
    private final String id;

    @JsonCreator
    public Cart(@JsonProperty("id") String id) { this.id = id;}

    public String getId() { return id; }
}

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    System.out.println(mapper.writeValueAsString(cart));
}

Выход

{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}

По умолчанию Jackson создает экземпляр любого класса, используя конструктор по умолчанию иметод установки / получения.
Поскольку ваш компонент является неизменяемым, т.е. не имеет конструктора и установщика по умолчанию, вам необходимо явно указать Jackson, как создать экземпляр класса Cart с использованием @JsonCreator и как установить значения свойств с помощью @JsonProperty.

1 голос
/ 05 апреля 2019

Вы должны добавить нормальный конструктор без каких-либо параметров, таких как:

public Cart() { }
...