scala - 将 DynamoDB 与 Scala 结合使用

标签 scala amazon-web-services amazon-dynamodb

我正在 Scala 中处理这个项目,并且正在使用本地 dynamodb 数据库测试我的一项服务。我正在使用第三方库 awscala 来访问该表。我在这部分代码中遇到了一些麻烦:

 override def put(status: Status) = {
   require(null != status, "The status object cannot be null.")

   table.put(status.id, "State" -> status.state)
 }

 override def get(id: String): Option[Status] = {
   require(StringUtils.isNotBlank(id), "The id of the status cannot be empty/null.")

   val state = dynamoDB.get(table, id)
   new Status(id, state)
 }

Status是我定义的一个类;它有字段 ID: String 和 state: State,其中 State 是我定义的案例类。当我根据 id 从表中获取某些内容并尝试创建一个新的 Status 对象时,返回的内容的类型是 Option[awscala.dynamodbv2.Item] ,但它需要类型 enums.State (我定义的案例类)。

我如何将 state 设为 enums.State 类型?

编辑:添加了状态及其案例对象的定义。

sealed trait State {}
case object COMPLETED_SUCCESSFULLY extends State {}
case object FINISHED_POLLING extends State {}
case object CURRENTLY_DOWNLOADING extends State {}
case object FINISHED_DOWNLOADING extends State {}

最佳答案

查看您正在使用的库的源代码,当 -> 的右侧时,table.put 看起来不会像您预期的那样运行> 不是字符串、数字或字节缓冲区。它将存储null

https://github.com/seratch/AWScala/blob/master/src/main/scala/awscala/dynamodbv2/AttributeValue.scala

相关代码为:

def toJavaValue(v: Any): aws.model.AttributeValue = {
    val value = new aws.model.AttributeValue
    v match {
      case null => null
      case s: String => value.withS(s)
      case n: java.lang.Number => value.withN(n.toString)
      case b: ByteBuffer => value.withB(b)
      case xs: Seq[_] => xs.headOption match {
        case Some(s: String) => value.withSS(xs.map(_.asInstanceOf[String]).asJava)
        case Some(n: java.lang.Number) => value.withSS(xs.map(_.toString).asJava)
        case Some(s: ByteBuffer) => value.withBS(xs.map(_.asInstanceOf[ByteBuffer]).asJava)
        case Some(v) => value.withSS(xs.map(_.toString).asJava)
        case _ => null
      }
      case _ => null
    }
  }

我建议您编写一些代码来将枚举编码到字符串或从字符串编码,并存储和检索它们。

关于scala - 将 DynamoDB 与 Scala 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975259/

相关文章:

Scala 通用子类型和蛋糕模式

scala - 在映射中查找其值满足函数的键

python - 在 AWS 中将 python3.5 设为默认值?

python - 将 AWS Secrets Manager 与 Python 结合使用(Lambda 控制台)

amazon-web-services - SQS消息接收乱序

amazon-web-services - 如何暂停/恢复AWS Lambda函数

scala - 如何为specs2测试指定不同的application.conf?

scala - 在intellij的sbt项目中使用spark

java - 如何将现有的关系数据库模型转换为适用于非 sql 数据库(如 Mongo DB 或 Amazon Dynamo DB)的模型

typescript - DynamoDB 表查询 KeyConditionExpression 错误