2014-09-12 9 views
0

현재 Salat에 문제가 있습니다. 너희들이 나를 도울 수 있기를 바라 라! 여기 Salat serialization 오류

은 나를 미치게되는 경우 클래스의 : 유형 의 인스턴스

object UserDAO extends SalatDAO[User, ObjectId](
    collection = DB("users") //Returns the "users" MongoCollection 
) 

case class User(
    _id: ObjectId = new ObjectId, 
    firstName: String, 
    lastName: String, 
    screenName: String, 
    phoneNumber: PhoneNumber, 
    validated: Boolean = false) 

PHONENUMBER됩니다 com.google.i18n.phonenumbers.Phonenumber $ PHONENUMBER

(나는 libphonenumber을 사용하고 있습니다) 이건 내 C가

class PhoneNumberTransformer extends CustomTransformer[PhoneNumber, String] { 
    val phoneNumberUtils = PhoneNumberUtil.getInstance() 
    def deserialize(b: String) = phoneNumberUtils.parse(b, "UK") 
    def serialize(a: PhoneNumber) = phoneNumberUtils.format(a, PhoneNumberFormat.INTERNATIONAL) 
} 

입니다 :

이 내 사용자 정의 트랜스포머 ustom 상황 :

project java.lang.IllegalArgumentException: can't serialize class com.google.i18n.phonenumbers.Phonenumber$PhoneNumber 
project  at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:284) 
project  at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:185) 
project  at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:131) 
project  at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:33) 
[...] 

이 문제를 해결하는 방법에 대한 어떤 생각 :

package object model { 

    implicit val ctx = new Context { 
    val name = "Custom Salat Context" 
    } 

    ctx.registerCustomTransformer(new PhoneNumberTransformer) 

} 

내가 UserDAO를 사용하여 새 사용자 문서를 삽입하려고하면, 나는이 예외가? 감사합니다.

+0

이 방법이 도움이되는지 모르겠지만'PhoneNumber'는 Java public static class입니다. –

답변

1

Salat 개발자가 필요합니다. libphonenumber에 익숙하지는 않지만 내부 클래스를 직렬화하려고하는 것처럼 보이기 때문에 이것이 무너질 가능성이 큽니다.

시도해 볼만한 것. PhoneNumber 클래스를 오브젝트, 특성 또는 클래스가 아닌 로컬 패키지의 최상위 레벨에 복사하고, 해당 클래스/인터페이스를 확장하여 i18n을 가져온 다음이 클래스에서 유형 param을 대신 가리 키도록 변경 한 경우 , 작동합니까?

그렇다면 Salat은 내부 클래스를 지원하지 않는다는 점이 문제입니다. 그렇지 않다면, 우리는 더보아야 할 것입니다.

+0

작동하지 않습니다. 나는 libphonenumber 문서를 살펴 봤고'PhoneNumber' 클래스가 내부 클래스이고 protobuf를 사용하여 생성되고 있음을 발견했습니다. 치명적인 것들의 혼합 : D. 당신의 도움을 주셔서 감사합니다! 나는 그 숫자를 당분간 문자열로 저장할 것입니다. –

0

Java 클래스를 Salat에 직접 직렬화 할 수 없습니다. 사용자 정의 Salat 시리얼 라이저를 작성하거나 케이스 클래스로 을 작성해야합니다.