케이스 클래스에 스칼라 열거가 포함되어 있는 경우 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
'programing' 카테고리의 다른 글
| Youtube 치수 워드프레스 (0) | 2023.03.06 |
|---|---|
| Oracle에서 PL/SQL Stored Function 본문을 표시하는 방법 (0) | 2023.03.06 |
| Android에서 일반 Java 어레이 또는 ArrayList를 Json 어레이로 변환 (0) | 2023.03.06 |
| TS를 사용하는 Redx DevTools 확장과 관련된 오류: "속성 '_REDUX_DEVTOOLS_EXTION_COMPOSE__'이(가) '윈도' 유형에 없습니다." (0) | 2023.03.01 |
| React에서 하위 상태의 상위 상태 액세스 (0) | 2023.03.01 |