1

注: Scala で Java クライアントを使用しています。case class注釈が若干異なります。私は次のPOJOを持っています:

case class User(
  @(JsonProperty@field)("guid")
  @(RiakKey@field)
  val guid: String,

  @(JsonProperty@field)("email")
  @(JsonSerialize@field)(using=classOf[util.serialization.StringToUrlSerializer])
  @(JsonDeserialize@field)(using=classOf[util.serialization.StringToUrlDeserializer])
  @(RiakIndex@field)(name = "email")
  val email: String,

  @(JsonProperty@field)("passwordHash")
  val passwordHash: String
)

突然、Riak は私のUser. REST クライアント経由で未加工の HTTP API を使用する場合は、セカンダリ インデックスを手動で作成することもできますが、コードでは失敗する理由を説明できません。

Riak オブジェクトを保存する方法は次のとおりです。

/**
   * Riak database operations
   */
  val bucketName = "accounts-user"
  val bucket = DB.client.createBucket(bucketName).enableForSearch().execute()
  val converter = {
    val c = new JSONConverter[User](classOf[User], bucketName)
    c.getObjectMapper().registerModule(DefaultScalaModule)
    c
  }

  def store(o: User) = bucket.store(o).withConverter(converter).withRetrier(DB.retrier).execute()

使用している Jackson インポートは次のとおりです。

import com.fasterxml.jackson.annotation._
import com.fasterxml.jackson.databind.annotation._

import com.fasterxml.jackson.module.scala._

オブジェクトは正常に保存されており、エラーはスローされていません。問題の原因は何ですか? DefaultScalaModulefor Jackson はアノテーションに干渉する可能性がありますか? 参考までに、カスタム コンバーターを削除しようとしましたが、問題は解決しませんでした (ただし、Scala モジュールのインポートは削除されませんでした)。ありがとう。

編集

関連する可能性があります: 最近、NGINX 経由で Riak のプロキシを開始しました。HTTP と TCP の両方を行う必要がありますproxy_passか?

4

1 に答える 1

0

私が疑ったように、NGINX を使用したプロキシが原因でした。私は HTTP クライアントを使用してバケットにアクセスしていましたが、Riak Java クライアントは実際には下位レベル (おそらく PBC) プロトコルを使用してセカンダリ インデックスを作成していました。サイレントに失敗する理由はわかりませんが (設計上の可能性があります)、NGINX を HTTP から TCP 転送に切り替えるとすぐに、問題はすぐに解決されました。

于 2013-04-30T16:47:03.183 に答える