如何在Lift Record中的MongoCaseClassField中存储枚举?

时间:2011-08-18 15:06:52

标签: scala mongodb lift

使用Lift Record,当我尝试检索下面的MongoDB条目时,在调用NullPointerException .asHtml方法时会引发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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

我很确定这只适用于String,Int,Float,Double,Boolean等本机类型,但不适用于Enumerations。我确信这是因为序列化。