Как сохранить перечисление в MongoCaseClassField в Lift Record? - PullRequest
1 голос
/ 18 августа 2011

Используя 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.Есть ли способ использовать перечисления в полях класса case или следует использовать другой тип поля?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2013

На момент написания 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 */
}

Дополнительные методы реализуют методы получения и установки для перечисления типа сотрудника.

2 голосов
/ 14 сентября 2011

Я совершенно уверен, что это будет работать только с нативными типами, такими как String, Int, Float, Double, Boolean и т. Д., Но не с перечислениями. Я действительно уверен, что это связано с сериализацией.

...