编写对文件

时间:2017-05-03 14:37:15

标签: vert.x

我是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)

处理程序方法handleGetRecordshandleNewRecord正在使用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_ENTRIESCREATE_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实例。

2 个答案:

答案 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) {

更多耦合,但也更有效。

对于更经典和直接的方法,您可以看到官方示例:

https://github.com/aokolnychyi/vertx-example/blob/master/src/main/java/com/aokolnychyi/vertx/example/dao/MongoDbTodoDaoImpl.java

你可以看到DAO几乎同步,但由于处理程序仍然是异步的,所以无论如何都很好。

答案 1 :(得分:0)

我想以下链接将为您提供帮助,这是Vertx Crud操作的一个很好的例子。

Vertx student crud operations using hikari