Я использую классы case для определения различных «моделей» данных в нашем приложении. Причина в том, чтобы упростить использование Jerkson (интерфейс Scala для Jackson). Чтобы преобразовать мой User
в объект домена в Riak, я использовал аннотацию @RiakKey
в своем guid. У меня есть следующее:
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
)
Когда я собираюсь выполнить преобразование домена в классе case, @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)
guid
на что-то отличное отnull
в объектеUser
, передаваемом в операцию сохранения, да? Используете ли вы свои собственные Mutation и ConflictResolver? - person Brian Roach   schedule 06.02.2013toDomain()
в конвертере использует их, чтобы знать, куда поместить полученные данные). - person Brian Roach   schedule 06.02.2013throw new NoKeySpecifed
, похоже, что она фактически выбрасывается при вызове метода хранилища. Интересно, не возвращает ли RiakObjectBuilder ключ. - person crockpotveggies   schedule 06.02.2013DefaultBucket.store(T o)
проверяет ключ и вот что кидает. Можете ли вы опубликовать свой код, где вы создаете объектUser
и передаете его методуBucket.store()
? (Это задолго до включения конвертера) - person Brian Roach   schedule 06.02.2013guid
со значением String в нем, а объектUser
заполняется им... Я в конце своего опыта. Погуглив аннотации java и scala, я не могу найти ничего, кроме того, что должно просто работать. - person Brian Roach   schedule 06.02.2013DomainBucket.store
, и мне нужно создать сегмент домена? Что-то увидел в комментариях вверхуDomainBucket.java
- person crockpotveggies   schedule 06.02.2013