我在我的应用程序中使用了一个名为PublishedState的枚举。在我开始重构i18n支持之前,我可以正常保存它。
以下是Theme域类的相关部分:
class Theme {
Map<String, String> name //language locale to name
Map<String,PublishedState> state //country locale to state
...
}
现在,以下代码无效:
Theme theme = new Theme(
name: [en: 'english name'],
state: [en: PublishedState.DRAFT]
)
assert theme.validate()
theme.save()
我收到以下错误:
java.lang.IllegalArgumentException: can't serialize class com.example.myapp.PublishedState
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putMap(BasicBSONEncoder.java:274)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:196)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:142)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:252)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:211)
at com.mongodb.DBCollection.insert(DBCollection.java:57)
at org.grails.datastore.mapping.mongo.MongoSession$1.doInDB(MongoSession.java:153)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:352)
at org.grails.datastore.mapping.mongo.MongoSession.flushPendingInserts(MongoSession.java:129)
at org.grails.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:238)
at org.grails.datastore.mapping.mongo.MongoSession.flush(MongoSession.java:113)
at org.grails.datastore.gorm.support.DatastorePersistenceContextInterceptor.flush(DatastorePersistenceContextInterceptor.java:90)
at Console$_run_closure3_closure6_closure8.doCall(Console.groovy:74)
at Console$_run_closure3_closure6.doCall(Console.groovy:73)
at Console$_run_closure3_closure6.doCall(Console.groovy)
我找不到任何关于它的信息,只关于保存列表和枚举集合的旧错误,这些错误应该已经解决了
我使用的是Grails版本:2.2.0和mongo插件:mongodb:1.0.0.GA
任何想法?
非常感谢!!!
答案 0 :(得分:0)
BasicBSONEncoder._putObjectField不支持枚举。快速解决方法是执行ourEnum.toString()或甚至更好的yourEnum.name()(因为.name()在字符串中给出了Enum的确切名称,不能覆盖)。
希望它有所帮助。