我是Vert.x的新手,并尝试实现一个小型REST API,将其数据存储在本地文件系统的JSON文件中。
到目前为止,我设法实现了REST API,因为Vertx在该部分上有很好的文档记录。
我目前正在寻找的是如何在Vert.x中构建数据访问对象的示例。如何实现可以对包含JSON的文本文件执行crud操作的Verticle?
你可以给我提供任何例子吗?任何提示?更新1:
通过对文件的CRUD操作,我正在考虑以下内容。想象一下,路径Records
上有一个名为/api/v1/user/:userid/records/
的REST资源。
在启动我的HTTP服务器的Verticle中,我有以下路由。
router.get('/api/user/:userid/records').handler(this.&handleGetRecords)
router.post('/api/user/:userid/records').handler(this.&handleNewRecord)
处理程序方法handleGetRecords
和handleNewRecord
正在使用Vertx事件总线发送消息。
request.bodyHandler({ b ->
def userid = request.getParam('userid')
logger.info "Reading record for user {}", userid
vertx.eventBus().send(GET_TIME_ENTRIES.name(), "read time records", [headers: [userId: userid]], { reply ->
// This handler will be called for every request
def response = routingContext.response()
if (reply.succeeded()) {
response.putHeader("content-type", "text/json")
// Write to the response and end it
response.end(reply.result().body())
} else {
logger.warn("Reply failed {}", reply.failed())
response.statusCode = 500
response.putHeader("content-type", "text/plain")
response.end('That did not work out well')
}
})
})
然后还有另一个Verticle消费这些消息GET_TIME_ENTRIES
或CREATE_TIME_ENTRY
。我认为这个消费者Verticle是Records
的数据访问对象。此Verticle可以读取包含所有用户记录的给定:userid
的文件。 Verticle能够
以下是阅读所有记录的示例。
vertx.eventBus().consumer(GET_TIME_ENTRIES.name(), { message ->
String userId = message.headers().get('userId')
String absPath = "${this.source}/${userId}.json" as String
vertx.fileSystem().readFile(absPath, { result ->
if (result.succeeded()) {
logger.info("About to read from user file {}", absPath)
def jsonObject = new JsonObject(result.result().toString())
message.reply(jsonObject.getJsonArray('records').toString())
} else {
logger.warn("User file {} does not exist", absPath)
message.fail(404, "user ${userId} does not exist")
}
})
})
我想要实现的是像上面那样读取文件并将JSON反序列化为POJO(例如List<Records>
)。使用Vertx的JsonObject
这似乎更方便。我不想操纵JsonObject实例。
答案 0 :(得分:1)
首先,在我看来,使用EventBus的方法很好。它可能会慢一点,因为EventBus将序列化/反序列化您的对象,但它会为您提供非常好的解耦。
您可以在此处看到另一种方法的示例:
https://github.com/aesteve/vertx-feeds/blob/master/src/main/java/io/vertx/examples/feeds/dao/RedisDAO.java
注意每个方法如何接收处理程序作为其最后一个参数:
public void getMaxDate(String feedHash, Handler<Date> handler) {
更多耦合,但也更有效。
对于更经典和直接的方法,您可以看到官方示例:
你可以看到DAO几乎同步,但由于处理程序仍然是异步的,所以无论如何都很好。
答案 1 :(得分:0)
我想以下链接将为您提供帮助,这是Vertx Crud操作的一个很好的例子。