我正在 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
。
相关代码为:
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/