2011-08-18 33 views
1

使用提升记录,当我尝试检索下面的MongoDB条目时,调用MongoCaseClassField.asHtml方法时引发NullPointerException如何在提升记录中的MongoCaseClassField中存储枚举?

object MyEnumeration extends Enumeration { 
    val A, B, C = Value 
} 

case class MyCaseClass(en: MyEnumeration.Value) 

class MyRecord extends MongoRecord[MyRecord] with MongoId[MyRecord] { 
    def meta = MyRecord 
    object fail extends MongoCaseClassField[MyRecord, MyCaseClass](this) 
} 

object MyRecord extends MyRecord with MongoMetaRecord[MyRecord] 

但是,如果我用String,而不是Enumeration能正常工作。有什么办法在案例类字段中使用枚举或应该使用不同类型的字段?

回答

2

我相当肯定这只适用于像String,Int,Float,Double,Boolean等原生类型,但不能枚举。我确信这是由于序列化。

+1

你说的没错,我决定使用'BsonRecord'作为容器而不是'MongoCaseClassField'。 –

+0

您能否将其标记为“已接受”,因此显示为“已回答”而不是未答复? :)谢谢(我喜欢保持它干净) –

+0

不知道我跟着你,答案被接受。检查您的个人资料9月14日,你从我+15:http://stackoverflow.com/users/319315/franz-bettag?tab=reputation –

3

在撰写本文时,mongoDB并没有很好的与scala枚举,我使用装饰器方法作为解决方法。

说你有这样的枚举:

object EmployeeType extends Enumeration { 
    type EmployeeType = Value 
    val Manager, Worker = Value 
} 

这MongoDB的记录:

import EmployeeType._ 
case class Employee(
    id: ObjectId = new ObjectId 
) 

在你的MongoDB,存储枚举,而不是枚举本身的整数索引:

case class Employee(
    id: ObjectId = new ObjectId, 
    employeeTypeIndex: Integer = 0 
){ 
    def employeeType = EmployeeType(employeeTypeIndex); /* getter */ 
    def employeeType_=(v : EmployeeType) = { employeeTypeIndex= v.id} /* setter */ 
} 

额外的方法为员工类型枚举实现getter和setter。