Cách cập nhật bản ghi mongo bằng Rogue với MongoCaseClassField khi lớp case chứa một bảng liệt kê scala


129

Tôi đang nâng cấp mã hiện có từ Rogue 1.1.8đến 2.0.0lift-mongodb-recordtừ 2.4-M5 to 2.5.

Tôi đang gặp khó khăn khi viết MongoCaseClassFieldcó chứa một scala enum, mà tôi thực sự có thể sử dụng một số trợ giúp.

Ví dụ,

object MyEnum extends Enumeration {
  type MyEnum = Value
  val A = Value(0)
  val B = Value(1)
}

case class MyCaseClass(name: String, value: MyEnum.MyEnum)

class MyMongo extends MongoRecord[MyMongo] with StringPk[MyMongo] {
  def meta = MyMongo

  class MongoCaseClassFieldWithMyEnum[OwnerType <: net.liftweb.record.Record[OwnerType], CaseType](rec : OwnerType)(implicit mf : Manifest[CaseType]) extends MongoCaseClassField[OwnerType, CaseType](rec)(mf) {
    override def formats = super.formats + new EnumSerializer(MyEnum)
  }

  object myCaseClass extends MongoCaseClassFieldWithMyEnum[MyMongo, MyCaseClass](this)
  /// ...
}

Khi chúng tôi cố gắng ghi vào trường này, chúng tôi nhận được lỗi sau:

không thể tìm thấy giá trị ngầm định cho tham số bằng chứng của loại com.f xông.rogue.BSONType [MyCaseClass] .and (_. myCaseClass setTo myCaseClass)

Chúng tôi đã từng làm việc này trong Rogue 1.1.8, bằng cách sử dụng phiên bản riêng của chúng tôi MongoCaseClassField, điều này làm cho phương thức #formats trở nên quá mức. Nhưng tính năng đó đã được đưa vào bản ghi nâng-mongodb trong 2.5-RC6, vì vậy chúng tôi nghĩ rằng nó chỉ nên hoạt động bây giờ?


9
Có vẻ như câu trả lời đã được cung cấp trong danh sách người dùng lừa đảo: grokbase.com/t/gg/rogue-users/1367nscf80/ Kẻ
Asya Kamsky

Câu trả lời:


7

Câu trả lời đến từ: http://grokbase.com/t/gg/rogue-users/ 20130612woc3x7utvaoacu7tv7lzn4sr2q

Nhưng thuận tiện hơn trực tiếp tại đây trên StackOverFlow:


Xin lỗi, tôi nên đã theo đuổi ở đây sớm hơn.

Một trong những vấn đề tồn tại lâu dài với Rogue là quá dễ dàng vô tình tạo ra một trường không được tuần tự hóa như BSON và bị lỗi khi chạy (khi bạn cố gắng thêm giá trị đó vào DBObject) thay vì vào thời gian biên dịch .

Tôi đã giới thiệu lớp loại BSONType để cố gắng giải quyết vấn đề này. Ưu điểm là nó bắt lỗi BSON tại thời điểm biên dịch. Nhược điểm là bạn cần đưa ra lựa chọn khi nói đến các lớp tình huống.

Nếu bạn muốn làm điều này theo cách "chính xác", hãy xác định lớp trường hợp của bạn cộng với "nhân chứng" BSONType cho lớp trường hợp đó. Để xác định một nhân chứng BSONType, bạn cần cung cấp tuần tự hóa từ loại đó sang loại BSON. Thí dụ:

 case class TestCC(v: Int)

 implicit object TestCCIsBSONType extends BSONType[TestCC] {
   override def asBSONObject(v: TestCC): AnyRef = {
     // Create a BSON object
     val ret = new BasicBSONObject
     // Serialize all the fields of the case class
     ret.put("v", v.v)
     ret
   }
 }

Điều đó nói rằng, điều này có thể khá nặng nề nếu bạn đang làm điều đó cho từng lớp trường hợp. Tùy chọn thứ hai của bạn là xác định một nhân chứng chung hoạt động cho bất kỳ lớp trường hợp nào, nếu bạn có sơ đồ tuần tự hóa chung:

 implicit def CaseClassesAreBSONTypes[CC <: CaseClass]: BSONType[CC] =
new BSONType[CC] {
   override def asBSONObject(v: CC): AnyRef = {
     // your generic serialization code here, maybe involving formats
   }
 }

Hi vọng điêu nay co ich,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.