注意我在 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 停止为我的用户
存储二级索引。如果我们通过 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._
对象已成功存储,并且未引发错误。问题的原因可能是什么? Jackson 的 DefaultScalaModule
是否可能干扰注释?仅供引用,我确实尝试删除自定义转换器,但它没有解决问题(但是没有删除任何 Scala 模块导入)。谢谢。
编辑
可能相关:最近我们开始通过 NGINX 代理 Riak。我需要同时执行 HTTP 和 TCP proxy_pass
吗?
最佳答案
正如我所怀疑的,使用 NGINX 进行代理是罪魁祸首。虽然我使用 HTTP 客户端访问存储桶,但 Riak Java 客户端实际上使用较低级别(可能是 PBC)协议(protocol)来创建二级索引。不知道为什么它会默默地失败(可能是由于设计),但当我将 NGINX 从 HTTP 切换到 TCP 转发时,问题立即得到解决。
关于java - Riak(Java客户端)突然停止创建二级索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16290194/