java - Riak Java Client 注释在 Scala 案例类中无法识别?

标签 java scala riak

我使用案例类在我们的应用程序中定义不同的数据“模型”。原因是为了能够轻松使用 Jerkson(Jackson 的 Scala 接口(interface))。为了将我的 User 转换为 Riak 中的域对象,我在我的 guid 上使用了 @RiakKey 注释。我有以下内容:

case class User(
  @RiakKey val guid: String,

  @RiakIndex(name = "email") val email: String,

  val salt: String,

  val passwordHash: String,

  val emailHash: String,

  val firstName: String,

  val lastName: String,

  val suspended: Boolean=false,

  val created: Timestamp=now

)

当我对案例类执行域转换时,无法识别@RiakKey。它抛出一个NoKeySpecifedException。这是我的转换器:

class UserConverter(val bucket: String) extends Converter[User] {

  def fromDomain(domainObject: User, vclock: VClock) = {
    val key = getKey(domainObject)

    if(key == null) throw new NoKeySpecifedException(domainObject)

    val kryo = new Kryo()
    kryo.register(classOf[User])

    val ob = new ObjectBuffer(kryo)
    val value = ob.writeObject(domainObject)

    RiakObjectBuilder.newBuilder(bucket, key)
        .withValue(value)
        .withVClock(vclock)
        .withContentType(Constants.CTYPE_OCTET_STREAM)
        .build()
  }
}

这是 Scala 中使用 Java 注释的问题吗?有解决办法吗?

更新

这里是创建和存储 User 对象以及引用转换器的位置:

1)

val user = parse[User](body) // jerkson parse, body is a string of JSON
User.store(user)

2)

object User {

  val bucketName = "accounts-users"
  val bucket = DB.client.createBucket(bucketName).execute()

  def fetch(id: String) = bucket.fetch(id).execute().getValueAsString()

  def store(o: User) = bucket.store( o ).withConverter(new UserConverter(bucketName)).execute()

}

追踪

com.basho.riak.client.convert.NoKeySpecifedException
        at com.basho.riak.client.bucket.DefaultBucket.store(DefaultBucket.java:455)
        at com.threetierlogic.AccountService.models.User$.store(User.scala:58)
        at com.threetierlogic.AccountService.controllers.Users$$anonfun$routes$3.apply(Users.scala:54)
        at com.threetierlogic.AccountService.controllers.Users$$anonfun$routes$3.apply(Users.scala:51)

最佳答案

(对于在此回答之前的长时间谈话,我表示歉意)

在学习了更多关于 scala 的知识后,我发现对于 case 类,你必须采取一些不同的做法。

http://piotrbuda.eu/2012/10/scala-case-classes-and-annotations-part-1.html

如果你这样做:

@(RiakKey@field) guid: String

它有效。

我在 scala 中编写了一个小型测试程序,并且能够使用 DefaultBucket 中使用的静态 getKey() 方法提取带注释的键,该方法返回 null 并导致要抛出的异常。

import com.basho.riak.client.convert.KeyUtil.getKey;

object Main {

  def main(args: Array[String]): Unit = {
    val u = User("my_key")
    val k = getKey(u)
    System.out.println(k);

  }
}

用户.scala

/* scala 2.9.1 would be scala.annotation.target.field */
import scala.annotation.meta.field
import com.basho.riak.client.convert.RiakKey;

case class User (@(RiakKey@field) guid: String)

输出:

my_key

(并且,如果您将注释更改回原来的方式,它将按预期返回 null)

关于java - Riak Java Client 注释在 Scala 案例类中无法识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719166/

相关文章:

erlang - 在提交后 Hook 中处理风险数据类型

database - 最佳 Riak 存储策略

java - Android 日志猫错误 ContextResult::kFatalFailure

scala - 当对其中一项的检查返回 false 时结束 for-comprehension 循环

java - Heroku JVM 调优

scala - Scala中的fun和fun()有什么区别?

riak - 如何在 Riak 中构建数据?

java - 从 Google Cloud Storage 获取存档版本

java - Vert.x - 从 POST 请求获取参数

java - 更改原始图像文件的颜色权重