Невозможно десериализовать экземпляр ‹Object› из токена START_ARRAY - webClient

Я пишу простой get метод с использованием веб-клиента для получения информации о свойствах. Но затем я получаю сообщение об ошибке ниже:

{
    "timestamp": "2019-02-25T06:57:03.487+0000",
    "path": "/modernmsg/getentity",
    "status": 500,
    "error": "Internal Server Error",
    "message": "JSON decoding error: Cannot deserialize instance of `com.reputation.api.modernmsg.model.Entity` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.reputation.api.modernmsg.model.Entity` out of START_ARRAY token\n at [Source: UNKNOWN; line: -1, column: -1]"
}

Фактический ответ json:

[
    {
        "name": "Point Breeze",
        "street": "488 Lemont Dr",
        "city": "Nashville",
        "state": "TN",
        "postal_code": "37216",
        "slug": "point-breeze"
    }
]

Ниже приведен метод извлечения свойства в моем классе контроллера:

@RequestMapping(method = RequestMethod.GET, value = "/getentity")
    public Mono<Entity> getEntity(@RequestParam("token") String token, @RequestParam("name") String name) {
        return service.fetchEntity(token, name);
    }

И мой метод fetchEntity:

public Mono<Entity> fetchEntity(String token, String name) {
        String url = host + version + entityEndpoint + "?token=" + token + "&name=" + name;
        return webClient.get().uri(url).retrieve().bodyToMono(Entity.class);
    }

Ниже моя модель сущности:

package com.reputation.api.modernmsg.model;

import java.util.List;

public class Entity {

    private List<ModernMsgEntity> modernMsgEntity;

    public List<ModernMsgEntity> getModernMsgEntity() {
        return modernMsgEntity;
    }

    public void setModernMsgEntity(List<ModernMsgEntity> modernMsgEntity) {
        this.modernMsgEntity = modernMsgEntity;
    }
}

Модель ModernMsgEntity - это:

package com.reputation.api.modernmsg.model;

public class ModernMsgEntity {
    private String name;
    private String street;
    private String city;
    private String state;
    private String postal_code;
    private String slug;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getPostal_code() {
        return postal_code;
    }

    public void setPostal_code(String postal_code) {
        this.postal_code = postal_code;
    }

    public String getSlug() {
        return slug;
    }

    public void setSlug(String slug) {
        this.slug = slug;
    }
}

Дайте мне знать, если вам понадобится дополнительная информация.


person theone1one    schedule 25.02.2019    source источник


Ответы (1)


Это скорее проблема десериализации JSON. Глядя на свой класс сущности, вы настраиваете все на ожидание ответа JSON, например:

{
"modernMsgEntity": [
    {
        "name": "Point Breeze",
        "street": "488 Lemont Dr",
        "city": "Nashville",
        "state": "TN",
        "postal_code": "37216",
        "slug": "point-breeze"
    }
  ]
}

Если вы хотите, чтобы Джексон десериализовал массив объектов напрямую, вы должны сообщить об этом так:

Flux<ModernMsgEntity> messages = webClient.get().uri(url).retrieve().bodyToFlux(ModernMsgEntity.class);
person Brian Clozel    schedule 25.02.2019
comment
Я пробовал с return webClient.get().uri(url).retrieve().bodyToFlux(ModernMsgEntity[].class);, но все равно выдает ту же ошибку JSON decoding error: Cannot deserialize instance of ModernMsgEntity[] out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of ModernMsgEntity[] out of START_OBJECT token\n at [Source: UNKNOWN; line: -1, column: -1] - person theone1one; 25.02.2019
comment
Это не та же ошибка, в вашем вопросе упоминается ошибка с START_ARRAY token, которая соответствует телу JSON, которое вы показываете. Вы уверены, что получаете правильный ответ? - person Brian Clozel; 25.02.2019
comment
Да, ответ правильный. Это массив объекта. - person theone1one; 25.02.2019
comment
Вы можете попробовать исключить WebFlux из уравнения, напрямую используя тело ответа как строку и десериализуя его с помощью экземпляра ObjectMapper с помощью метода readValue. - person Brian Clozel; 25.02.2019
comment
Я попытался вернуть Mono<ModernMsgEntity[]> вместо Flux<ModernMsgEntity[]>, и это сработало. - person theone1one; 25.02.2019
comment
Давайте продолжим это обсуждение в чате. - person theone1one; 25.02.2019