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

时间:2018-06-27 22:44:19

标签: vert.x

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

E.G。

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

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

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

我还希望能够从调用堆栈的任何层返回它。例如验证传递给服务层的参数。

我的问题是我看不到如何在失败的将来返回JsonObject。

2 个答案:

答案 0 :(得分:2)

您可以通过Future失败ServiceException,其中该int包含失败代码,消息和包含额外信息的JsonObject

如服务代理文档的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);
}

答案 1 :(得分:0)

Message类为此具有方法fail()

尝试以下代码段(java 8):

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