2013-10-05 4 views
0

저는 scala newbie이고 Ruby 배경에서 왔기 때문에 스카 트라를 사용하는 웹 서비스에서 json 응답을 렌더링하는 데 문제가 있습니다. liftweb을 사용하는 mongodb mongo 레코드 및 argonaut JSon 직렬화 및 deserialisation.net.liftweb.mongodb.record.MongoRecord 및 Argonaut를 사용할 때 스칼라 toJson

그러나 http://argonaut.io/에 주어진 예제를 기반으로 net.liftweb.mongo.record 라이브러리를 사용할 때 이것이 어떻게 작동하는지 알 수 없습니다.

이 컴파일시에는 type mismatch이라는 오류가 표시됩니다. 오류 설명은 코드 스니 j 다음에옵니다.

 

package firstscalatraapp 

import org.scalatra 
import net.liftweb.mongodb._ 
import net.liftweb.mongodb.record.MongoRecord 
import net.liftweb.mongodb.record.field.ObjectIdPk 

import net.liftweb.record.field.StringField 
import net.liftweb.record.field.IntField 
import net.liftweb.record.field.PasswordField 
import net.liftweb.record.field.DateTimeField 
import net.liftweb.mongodb.record.MongoMetaRecord 
import argonaut._ 
import Argonaut._ 

case class Person private extends MongoRecord[Person] with ObjectIdPk[Person] { 
    def meta = Person 
    object age extends IntField(this, 3) 
    object name extends StringField(this, 29) 
    object created_at extends DateTimeField(this) 
    object password extends PasswordField(this) 
} 

object Person extends Person with MongoMetaRecord[Person] { 
implicit def PersonCodecJson: CodecJson[Person] = 
    casecodec3(Person.apply, Person.unapply)("name", "age", "things") 
} 


내가 오류는

생성자는 매개 변수와 몽고 라이브러리를 허용하지 않기 때문에 논리적 인 것 같다
 

[error] found :() => firstscalatraapp.Person 
[error] required: (?, ?, ?) => ? 
[error] casecodec3(Person.apply, Person.unapply)("name", "age", "things") 
[error]     ^
[error] one error found 
[error] (compile:compile) Compilation failed 
 

내가 클래스에 필요한 필드의 val를 (생성 될 것입니다 나는 아직도 리프트 몽고 래퍼가 무엇을하는지 완전히 이해하지 못한다.)

그래서 어떻게 사람을 입력 한 serialise 개체를 찾을 수 있도록 암시 적으로 정의 할 수 있습니다.

또한 컬렉션을 처리 할 때 직렬화 기능을 어떻게 정의합니까? 예를 들어 List[Person]입니다.

미리 감사드립니다. 나는 이것에 관해서 내가 얻을 수있는 어떤 도움에 정말로 감사 할 것이다.

답변

0

나는 Argonaut를 사용하기 시작 했으므로 전문가는 아니지만 초기 문제는 명백한 것처럼 보입니다.

casecodec3에는 코덱을 정의 할 클래스의 생성자와 deconstructor가 필요합니다. Argonaut의 사례에서는 사례 클래스를 사용하고 있으며 정의 된 필드에 대해 적용/적용 취소와 함께 자동으로 동반자 개체를 생성했습니다. casecodec3는 3 일 필요가 있습니다. 케이스 클래스의 케이스 클래스는 0입니다. 케이스 클래스 필드가 전혀 없습니다. 레코드의 필드는 고유 한 적용 메소드 (매우 필수적인 항목)가있는 내부 오브젝트로 정의됩니다. 그것은 리프트 레코드가 정의되는 방식입니다. 따라서 적용 방법은 just() => Person입니다.

casecodec3는 3- 튜플에서 Person으로, Person에서 3- 튜플로 기능을 원합니다. 리프트 기록을 사용하려는 경우 사례 정의를 건너 뛰는 것이 좋습니다. 대신 측면에 함수를 만듭니다. 같은 뭔가 : 다른 질문에 대해서는

object Person extends Person with MongoMetaRecord[Person] { 
implicit def PersonCodecJson: CodecJson[Person] = 
    casecodec3(parse, serialize)("name", "age", "things") 

    // Something like 
    def parse(name: String, age: Int, things: Something) = { 
    val p = Person.createRecord 
    p.name(name) 
    ... 
    } 

    def serialize(p: Person) = (p.name.get, p.age.get, p.things.get) 

} 

나는 다시 머리를 수 다시 argonaut.io 생각합니다. 그들의 문서는 꽤 괜찮은 것 같습니다. 당신이이 질문을 일종의 오래된 것으로 게시했을 때 더 나빴을 수도 있습니다.

저는 리프트 - json에서 argonaut로 모든 직렬화를 대체하려고합니다. 그래도 여전히 붙어 있다면 (아마 그렇지 않을 것입니다) 조금 더 잘 대답 할 수있을 것입니다.

관련 문제