programing

케이스 클래스에 스칼라 열거가 포함되어 있는 경우 MongoCaseClassField를 사용하여 Mongo 레코드를 갱신하는 방법

fastcode 2023. 3. 6. 21:30
반응형

케이스 클래스에 스칼라 열거가 포함되어 있는 경우 MongoCaseClassField를 사용하여 Mongo 레코드를 갱신하는 방법

에서 기존 코드를 업그레이드하고 있습니다.Rogue 1.1.8로.2.0.0그리고.lift-mongodb-record부터2.4-M5 to 2.5.

쓰기가 어려워요.MongoCaseClassField스칼라 열거가 들어있으니 도움이 필요하겠네요

예를들면,

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)
  /// ...
}

이 필드에 쓰려고 하면 다음 오류가 나타납니다.

com 형식의 증거 매개 변수에 대한 암시 값을 찾을 수 없습니다.포스퀘어.2014.BSONType [ My Case Class ] . and ( . my Case Class set To my Case Class )

이전에는 Rogue 1.1.8에서 자체 버전을 사용하여 이 기능을 수행했습니다.MongoCaseClassField이로 인해 #syslog 메서드는 덮어쓸 수 있게 되었습니다.하지만 그 기능은 2.5-RC6의 리프트 몽고브 레코드에 포함되어 있기 때문에, 지금 바로 작동해야 한다고 생각했습니다.

답변은 http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration#20130612woc3x7utvaoacu7tv7lzn4sr2q 에서 얻을 수 있습니다.

그러나 StackOverFlow에서 직접 사용하는 것이 더 편리합니다.


미안해, 내가 좀 더 일찍 여기에 끼어들었어야 했는데.

Rogue의 오랜 문제 중 하나는 BSON으로 시리얼화할 수 없는 필드를 실수로 만들어 컴파일 시간이 아닌 런타임(DBObject에 값을 추가하려고 할 때)에 실패하는 것이 너무 쉽다는 것입니다.

이 문제에 대처하기 위해 BSONType 클래스를 도입했습니다.장점은 컴파일 시에 BSON 오류를 검출한다는 것입니다.단점은 사례 수업에서 선택을 해야 한다는 것입니다.

이 작업을 "올바른" 방법으로 수행하려면 사례 클래스와 해당 사례 클래스에 대한 BSONType "목격자"를 정의합니다.BSONType Witness를 정의하려면 해당 유형에서BSON 유형으로의 시리얼화를 제공해야 합니다.예:

 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
   }
 }

단, 케이스 클래스별로 실시하는 경우는 매우 부담스러울 수 있습니다.두 번째 옵션은 범용 시리얼라이제이션스킴이 있는 경우 모든 케이스클래스에 유효한 범용 증인을 정의하는 것입니다.

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

이게 도움이 됐으면 좋겠는데

언급URL : https://stackoverflow.com/questions/16992382/how-to-update-a-mongo-record-using-rogue-with-mongocaseclassfield-when-case-clas

반응형