Vert.x,RoutingContext 无法接收 json 数组
Vert.x, RoutingContext can't receive json array
我在接收 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
租户安全class:
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 class注册为Security handler,根据X-TENANT-ID header值
切换指向数据库的指针
这个问题实际上与您发布的代码无关,而是与您的下一条路线有关。
您发送的数组不是有效的 JSON 对象。
您可以:
- 从您的客户那里打包发送:
{"array":[...]}
- 改用
getBodyAsJsonArray
下面是一些您可以玩的代码:
最终顶点 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());
});
我在接收 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
租户安全class:
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 class注册为Security handler,根据X-TENANT-ID header值
切换指向数据库的指针这个问题实际上与您发布的代码无关,而是与您的下一条路线有关。
您发送的数组不是有效的 JSON 对象。
您可以:
- 从您的客户那里打包发送:
{"array":[...]}
- 改用
getBodyAsJsonArray
下面是一些您可以玩的代码: 最终顶点 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());
});