具有枚举值的Scala序列化异常 [英] Scala serialization exception with Enumeration Value

查看:70
本文介绍了具有枚举值的Scala序列化异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为scala和MongoDB Salat插件使用play 2.1框架.

I'm using the play 2.1 framework for scala and the MongoDB Salat plugin.

更新Enumeration.Value时出现异常:

When I update an Enumeration.Value I got an exception:

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可以正常工作.我的案例类如下:

Inserting the Enumeration.Value works fine. My case class looks like:

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))))
    }
}

有什么想法可以使它正常工作吗?

Any ideas how to get that working?

解决方法:如果我将Enumeration.Value强制转换为String,则可以使用,但这不是应该的方式...

workaround: it works if I cast the Enumeration.Value toString, but that's not how it should be...

UserDAO.dao.update(q = MongoDBObject("_id" -> new ObjectId(id)), o = MongoDBObject("$set" -> MongoDBObject("language" -> Language.EN.toString))))

推荐答案

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

Salat only does its work when you serialize to and from your model object with the grater, not when you do queries with MongoDB-objects yourself. The mongo driver api knows nothing about the annotation @EnumAs. (In addition to that even if you could use salat for that, how would it be able to know that you are referring to User.language in a generic key->value MongoDBObject?)

因此,您必须按照解决方法中的描述进行操作.要进行查询时,请自己提供枚举的值".

So you have to do like you describe in your workaround. Provide the "value" of the enum yourself when you want to do queries.

这篇关于具有枚举值的Scala序列化异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆