【问题标题】:Grails+mongoDB : Can't serialize Map<String, Enum>Grails+mongoDB:无法序列化 Map<String, Enum>
【发布时间】:2013-02-05 16:39:42
【问题描述】:

我在我的应用程序中使用了一个名为 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

有什么想法吗?

非常感谢!!!

【问题讨论】:

  • 如果对枚举执行 toString 会保存吗?
  • 我想我可以做到,但你认为这是一个优雅的解决方案?如果没有 Map,mongo-plugin 知道对 Enum 进行编组和解组字符串并返回......我想知道为什么当它是另一个数据结构时它不能这样做。
  • 你也可以定义一个自定义的用户类型,但感觉会让你的生活变得比它需要的更复杂 - springsource.github.com/grails-data-mapping/mongo/manual/guide/…

标签: mongodb grails grails-orm


【解决方案1】:

BasicBSONEncoder._putObjectField 不支持枚举。一个快速的解决方法是执行 ourEnum.toString() 甚至更好的 yourEnum.name() (因为 .name() 给出了字符串中枚举的确切名称并且不能被覆盖)。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多