我正在为 Scala 和 MongoDB Salat 插件使用 play 2.1 框架。

当我更新 Enumeration.Value 时出现异常:

java.lang.IllegalArgumentException: can't serialize class scala.Enumeration$Val
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270) ~[mongo-java-driver-2.11.1.jar:na]
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295) ~[mongo-java-driver-2.11.1.jar:na]
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234) ~[mongo-java-driver-2.11.1.jar:na]
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174) ~[mongo-java-driver-2.11.1.jar:na]
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120) ~[mongo-java-driver-2.11.1.jar:na]
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27) ~[mongo-java-driver-2.11.1.jar:na]

插入 Enumeration.Value 工作正常。我的案例类看起来像:
case class User(
    @Key("_id") id: ObjectId = new ObjectId,
    username: String,
    email: String,
    @EnumAs language: Language.Value = Language.DE,
    balance: Double,
    added: Date = new Date)

和我的更新代码:
object UserDAO extends ModelCompanion[User, ObjectId] {

    val dao = new SalatDAO[User, ObjectId](collection = mongoCollection("users")) {}

    def update(): WriteResult = {
        UserDAO.dao.update(q = MongoDBObject("_id" -> new ObjectId(id)), o = MongoDBObject("$set" -> MongoDBObject("language" -> Language.EN))))
    }
}

任何想法如何让它发挥作用?

编辑:

解决方法:如果我将 Enumeration.Value 转换为字符串,它会起作用,但这不是它应该的样子......
UserDAO.dao.update(q = MongoDBObject("_id" -> new ObjectId(id)), o = MongoDBObject("$set" -> MongoDBObject("language" -> Language.EN.toString))))

最佳答案

Salat 仅在您使用 grater 对模型对象进行序列化时才起作用,而不是在您自己使用 MongoDB 对象进行查询时起作用。 mongo 驱动程序 api 对 @EnumAs 注释一无所知。 (除此之外,即使您可以为此使用 salat,它如何知道您在通用键 -> 值 MongoDBObject 中指的是 User.language?)

所以你必须像你在解决方法中描述的那样做。当您要进行查询时,请自己提供枚举的“值”。

10-07 20:55