当前位置: 首页 > 知识库问答 >
问题:

编写对文件执行CRUD操作的顶点

池麒
2023-03-14

我是Vert的新手。我正在尝试实现一个小型REST API,它将数据存储在本地文件系统的JSON文件中。

到目前为止,我设法实现了REST API,因为Vertx在这方面有很好的文档记录。

我目前正在寻找的是如何在Vert. x中构建数据访问对象的示例。我怎样才能实现一个可以对包含JSON的文本文件执行粗鲁操作的版本?

你能给我举些例子吗?有什么提示吗?

更新1:

通过对文件进行CRUD操作,我想到了以下内容。想象一下,在路径/api/v1/user/: userid/记录/上有一个名为Records的REST资源。

在启动HTTP服务器的垂直通道中,我有以下路径。

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')
   }
  })
})

然后还有另一个顶点消耗这些消息GET_TIME_ENTRIESCREATE_TIME_ENTRY。我认为这个消费者顶点是记录的数据访问对象。这个顶点可以读取包含所有用户记录的给定: userid的文件。顶点能够

  • 添加一条记录
  • 读取所有记录
  • 读取特定记录
  • 更新一条记录
  • 删除一条或全部记录

这里是读取所有记录的例子。

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(例如列表)


共有2个答案

谭志用
2023-03-14

我想下面的链接会帮助你,这是Vertx crud操作的一个很好的例子。

使用hikari的Vertx学生积垢操作

湛宏旷
2023-03-14

首先,在我看来,您使用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基本上是同步的,但是由于处理程序仍然是异步的,所以它还是可以的。

 类似资料:
  • 如果已知主键的值,那么可以使用这些方法进行 CRUD 操作 对 object 操作的四个方法 Read / Insert / Update / Delete o := orm.NewOrm() user := new(User) user.Name = "slene" fmt.Println(o.Insert(user)) user.Name = "Your" fmt.Println(o.Up

  • 代码从卡中刮取单个事件,但我一直收到以下错误: C:\Python27\python.exeC:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py回溯(最近的调用最后):文件"C:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py",第31行,在writer.writerow(c)值错误: I/O关闭文件的操作 我正在使用pyCharm。 退出代码为

  • 我知道这应该很简单,但是我想从熊猫数据框中取一列,并且只对满足某些条件(比如小于1)的条目乘以标量(比如2)。 例如,在这个数据框中, 如果我有兴趣在列上执行此操作,结果应该是 我有以下绝对任务: 但是我不知道如何使用中的实际值。 提前谢谢!

  • 我有一个猫鼬模式 我最初设置了名称和电话字段的集合。我需要将集合更新为消息数组中的新消息和新地址到地址对象中。该函数还必须处理任何单个操作,即在某些情况下我只更新到消息数组或更新到名称和地址。所以我如何在单个函数中执行所有操作。

  • Redisson 支持对每个操作自动重试的策略并且在每次尝试期会尝试发送命令。 重试策略由设置项 retryAttempts (默认为 3) 和 retryInterval (默认为 1000 ms) 来控制。 每次尝试会在 retryInterval 时间间隔后执行。 Redisson 实例和 Redisson 对象都是完全线程安全的。 带有同步/异步方法的 Redisson 对象可通过 Red