2014-03-13 2 views
0

mongodb를 사용하여 2.1.5 버전에서 내 BSON 리더/라이터를 만들려고 힘듭니다. 여기 play2 framework mongodb : [NoSuchElementException : None.get]

는 응용 프로그램/모델/Boat.scala의 코드 발췌 한 것입니다

implicit object BoatBSONReader extends BSONDocumentReader[Boat] { 
def read(doc: BSONDocument): Boat = 
    Boat(
    (...) 
    doc.getAs[Accomodation]("accomodation").get, 
    (...) 
) 
} 

그런 다음 응용 프로그램/모델/Accomodation.scala에 내가있다 : 나는 "옵션을 사용하고

case class Accomodation(number_cabins: Int, cabin_configuration: Option[String], bed_configuration: Option[String], number_guest: Int) 
(...) 
implicit object AccomodationBSONReader extends BSONDocumentReader[Accomodation] { 
def read(doc: BSONDocument): Accomodation = 
    Accomodation(
    doc.getAs[Int]("number_cabins").get, 
    doc.getAs[String]("cabin_configuration"), 
    doc.getAs[String]("bed_configuration"), 
    doc.getAs[Int]("number_guest").get) 
    } 
} 

[문자열] "필드가있을 수 있습니다. 그 키는 mongodb 레코드에서 누락 될 수 있습니다. 어떤 경우에는 내 스칼라 개체에서 빈 값을 반환하고 싶습니다.

컴파일 타임에이 오류를 일으키는 :

[NoSuchElementException: None.get] 
doc.getAs[Accomodation]("accomodation").get, 

아마 누군가가 올바른 방향으로 날 가리 킵니다.

고맙습니다.

답변

1

이것은 컴파일 타임 오류가 아니며 런타임 오류이므로 보트로 역 직렬화하려는 문서를 독자가 읽을 수 없음을 의미합니다.

문서에 필드 "accomodation"이 없거나 Accomodation 판독기로 Accomodation 인스턴스로 역 직렬화 할 수없는 값을 가질 수 있습니다. 이로 인해 getAs[A](name)None을 반환합니다.

None.get을 호출하면 일반적으로 NoSuchElementException이 나오므로 옵션에서 .get을 호출하는 것이 좋지 않은 것으로 간주됩니다. 대신에 두 가지 가능한 선택 사항을 항상 처리해야합니다. 그 Success 또는 Fail 중 하나를 반환으로 Fail 오류에 대한 세부 정보를 보존 할 수있는 곳, http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

당신은 아마도 대신 BSONDocument.getAsTry[A](name)를 사용하여 무엇이 잘못되었는지에 대한 자세한 정보를 얻을 수있다 : 당신은 옵션 예를 들어 여기에 작동하는 방법에 대한 자세한 내용을보실 수 있습니다.

+0

요한에게 명확한 답변을 해 주셔서 감사합니다. 더 일하게 될 것이고 내가 성공하면 다시 게시 할 것입니다. –