具有枚举值的Scala序列化异常 [英] Scala serialization exception with Enumeration Value
问题描述
我正在为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屋!