Vert.x, RoutingContext не может получить массив json


У меня проблема с получением массива json.

Отправка JSON - это:

[
     {
        "name": "Account 3",
        "type": 2,
        "active": true
     },
     {
         "name": "Account 4",
         "type": 1,
         "active": true
     },
     {
         "name": "Account 5",
         "type": 0,
         "active": true
     }
]


Ошибка:

Mar 31, 2018 6:28:37 PM io.vertx.ext.web.impl.RoutingContextImplBase
SEVERE: Unexpected exception in route
io.vertx.core.json.DecodeException: Failed to decode: Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token

Класс TenantSecurity:

class TenantSwitcherHandler(val vertx: Vertx) {
fun switchTenant(routingContext: RoutingContext) {
    val tenantId: String? = routingContext.request().headers().get(CommonConstants.HEADER_TENANT)
    if (tenantId.isNullOrEmpty()) {
        routingContext.response().setStatusCode(HttpResponseStatus.UNAUTHORIZED.code()).end(ErrorMessages.CANT_FIND_X_TENANT_ID_HEADER.value())
        return
    } else {
        vertx.eventBus().send(CommonConstants.SWITCH_TENANT, tenantId)
        routingContext.next()
    }
}
}

Ошибка возникает при выполнении routingContext.next () ... как исправить проблему?

P.S .: Класс TenantSwitcherHandler, зарегистрированный как обработчик безопасности, который переключает указатель на базу данных в соответствии со значением заголовка X-TENANT-ID


person Bakhrom Achilov    schedule 31.03.2018    source источник


Ответы (1)


На самом деле эта проблема связана не с опубликованным вами кодом, а со следующим маршрутом, который у вас есть.
Отправленный вами массив не является допустимым объектом JSON.
Вы можете либо:

  1. Отправьте его от вашего клиента в упаковке: {"array":[...]}
  2. Вместо этого используйте getBodyAsJsonArray

Вот код, с которым вы можете поиграть: final Vertx vertx = Vertx.vertx ();

    Router router = Router.router(vertx);
    router.route().handler(BodyHandler.create());
    router.post("/").handler(c -> {
            JsonObject json = c.getBodyAsJson();
            // If you want to read JSON array, use this
            // JsonArray jsonArray = c.getBodyAsJsonArray();

            c.response().end(json.toString());
        }
    );
    vertx.createHttpServer().requestHandler(router::accept).listen(8443);


    System.out.println("Server started");
    WebClient client = WebClient.create(vertx);

    // This will succeed
    client.request(HttpMethod.POST, 8443, "localhost", "/").
            sendBuffer(Buffer.buffer("{}"), h -> {
                System.out.println(h.result().bodyAsString());
            });

    // This will fail
    client.request(HttpMethod.POST, 8443, "localhost", "/").
            sendBuffer(Buffer.buffer("[]"), h -> {
                System.out.println(h.result().bodyAsString());
    });
person Alexey Soshin    schedule 02.04.2018
comment
OP может просто получить тело как Buffer и десериализовать его так, как ему нравится, используя любой специально настроенный десериализатор JSON. - person Oleg Sklyar; 02.04.2018
comment
Спасибо за ваш ответ. Я исправил проблему, отправив завернутый массив - person Bakhrom Achilov; 03.04.2018