Сопоставление строки json с объектом с помощью jackson вызовет исключение MismatchedInputException - PullRequest
3 голосов
/ 27 марта 2019

у меня простой класс

public class AuthenticationToken {

    public String token;

    public AuthenticationToken(String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

С Джексоном я пытаюсь сопоставить строку с этим объектом, как это

private String input = "{\"token\":\"adf\"}";


@Test
public void whenJsonString_ThenCreateAuthenticationObject() throws IOException {

    ObjectMapper jsonMapper = new ObjectMapper();
    AuthenticationToken tokenObject = jsonMapper.readValue(input, AuthenticationToken.class);
    assertThat(tokenObject).isNotNull();
}

Но выдает следующее исключение

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `foo.AuthenticationToken` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"token":"adf"}"; line: 1, column: 2]

Я попытался аннотировать свойство в моем AuthenticationToken как @JsonProperty, но это также привело к этому исключению.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Джексон по умолчанию ожидает конструктор " empty " и автоматически заполняет ваш объект методами получения и установки, предоставленными для каждого поля.

Таким образом, удаление аргументов вашего конструктора уже решит вашу проблему:

public class AuthenticationToken {

    public String token;

    public AuthenticationToken() {}

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

Вы также можете просто добавить дополнительный пустой конструктор, если хотите сохранить текущий как есть. Протестировал оба варианта для вашего тестового примера, оба работают нормально.

1 голос
/ 27 марта 2019

Аннотируйте конструктор класса с помощью @JsonCreator

аннотация маркера, которую можно использовать для определения конструкторов и фабрики методы как один для использования в новых экземплярах ассоциированный класс.

public class AuthenticationToken {
    public String token;

    @JsonCreator
    public AuthenticationToken(@JsonProperty("token") final String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...