注意我在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 Objects的方法:
/**
* 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()
我们正在使用的杰克逊进口如下:
import com.fasterxml.jackson.annotation._
import com.fasterxml.jackson.databind.annotation._
import com.fasterxml.jackson.module.scala._
成功存储对象并且不会抛出错误。问题可能是什么原因?杰克逊的DefaultScalaModule
是否可能会干扰注释?仅供参考我尝试删除自定义转换器但它没有解决问题(但是没有删除任何Scala模块导入)。感谢。
可能相关:最近我们开始通过NGINX代理Riak。我是否需要同时执行HTTP和TCP proxy_pass
?
答案 0 :(得分:0)
就像我怀疑的那样,使用NGINX进行代理是罪魁祸首。虽然我使用HTTP客户端访问存储桶,但Riak Java客户端实际上使用较低级别(可能是PBC)协议来创建二级索引。不知道为什么它会无声地失败(可能是由于设计)但是一旦我将NGINX从HTTP切换到TCP转发,问题立即得到解决。