在 vertx 中,如何提供操作失败的结果

In vertx, how to provide a result with a failed operation

我正在使用服务代理在数据库中为给定域对象创建新记录。它委托给一个 repo,然后委托给一个 DAO。在插入操作失败的情况下(例如,由于违反唯一约束),我似乎只能 return 一个 Throwable 或一个 String。

例如

resultHandler.handle(Future.failedFuture(insertAsyncResult.cause()));

我想 return 给浏览器的是一个看起来像这样的 JSON 对象...

{
    error: {
        code: "VALIDATION_ERROR",
        context: {
            validationErrors: {
                username: "The username is already in use"
            }
        }
    }
}

我还希望能够 return 从调用堆栈的任何层执行此操作。例如验证传递给服务层的参数。

我的问题是我不知道如何在失败的未来中 return JsonObject。

Message class 有用于该目的的方法 fail()

试试这个片段 (java 8):

vertx.eventBus().consumer("SOME_ADDRESS", event -> {
    try {
        doSomeWork();
        event.reply("OK");
    } catch (Exception e) {
        event.fail(FAILURE_CODE, composeJson(e));
    }
});

您可以使用具有 int 失败代码的 ServiceException、消息和包含额外信息的 JsonObject 使 Future 失败。

如服务代理文档的 Error Handling 部分所示:

if (!shoeSize.equals("9")) {
 int errorCode = 78; // can be anything
 JsonObject details = new JsonObject().put("shoeSize", shoeSize);
 resultHandler.handle(ServiceException.fail(errorCode, "The shoe size must be 9!", details);
}