2015-11-18 2 views
1

У меня есть следующий класс (упрощенный немного есть), что позволит расширить JSON-формат для определенных объектов, которые представляют собой базу данных уровня с идентификатором поля:Scala/Play 2,4 JSON вопрос Формат

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

class EntityFormat[T <: Entity](entityFormatter: Format[T]) extends Format[T] { 
    val extendedFormat: Format[T] = (
     __.format[T](entityFormatter) ~ 
    (__ \ "id").format[Option[Long]] 
)(tupleToEntity, entityToTuple) 

    private def tupleToEntity(e: T, id: Option[Long]) = { 
    e.id = id 
    e 
    } 

    private def entityToTuple(e: T) = (e, e.id) 

    def writes(o: T): JsValue = extendedFormat.writes(o) 

    def reads(json: JsValue): JsResult[T] = extendedFormat.reads(json) 
} 

abstract class Entity { 
    var id: Option[Long] = None 
} 

С Play 2,3, я мог бы написать

implicit val userFormat: Format[User] = new EntityFormat(Json.format[User]) 

что бы потом работать с с ID-поля, находясь в сгенерированном JSON. Тем не менее, с Play 2.4 я получаю вопросы, следующие во время компиляции:

No Json formatter found for type Option[Long]. Try to implement an implicit Format for this type. (__ \ "id").format[Option[Long]] 
missing arguments for method tupleToEntity in class DomainEntityFormat; follow this method with `_' if you want to treat it as a partially applied function)(tupleToEntity, entityToTuple) 
                                          ^
missing arguments for method tupleToEntity in class DomainEntityFormat; follow this method with `_' if you want to treat it as a partially applied function)(tupleToEntity, entityToTuple) 
                                              ^

Как вы должны сделать расширение с Play 2.4, чтобы сделать этот вид JSON формат работы?

ответ

2

Вместо:

(__ \ "id").format[Option[Long]] 

Try:

(__ \ "id").formatNullable[Long] 
+0

Cheers, что, кажется, сделать трюк. – mpartan

Смежные вопросы