1

Я пытаюсь перенести свой проект с play2-reactivemongo версии 0.10.5.0.akka23 на версию 0.11.7.play23. Я уже добавил следующий импорт, чтобы исправить проблемы, адресованные в this question:Нет Json serializer as JsObject для типа play.api.libs.json.JsValue

import play.modules.reactivemongo.json._ 

С предыдущей версией, следующий код работает:

val updateEntity = Json.obj("_id" -> Json.obj("$oid" -> id)) 
val entity = Json.parse(stringJson) 
collection.update(updateEntity, entity) 

однако, с помощью новой версии, то третья строка дает ошибку компиляции:

[error] No Json serializer as JsObject found for type play.api.libs.json.JsValue. Try to implement an implicit OWrites or OFormat for this type. 
[error]  collection.update(updateEntity, entity) 
[error]     ^

Я попытался введение неявного OWriter:

implicit val toJsObject: OWrites[JsValue] = OWrites.apply(_.as[JsObject]) 

но дает неявную декларацию конфликт:

[error] ambiguous implicit values: 
[error] both value toJsObject of type play.api.libs.json.OWrites[play.api.libs.json.JsValue] 
[error] and object JsObjectDocumentWriter in trait ImplicitBSONHandlers of type play.modules.reactivemongo.json.JsObjectDocumentWriter.type 
[error] match expected type collection.pack.Writer[play.api.libs.json.JsObject] 
[error]  collection.update(updateEntity, entity) 
[error]     ^

меняющемуся вторую строчку в

val entity = Json.parse(stringJson).as[JsObject] 

исправляет проблему, но у меня есть много их вокруг моего кода, и я надеялся, для более простого решения.

+1

Почему бы не написать функцию типа 'def parseJson (json: String) = {Json.parse (json) .as [JsObject]}' и использовать эту функцию вместо этого. – curious

+0

@curious Я надеялся на магический импорт, который добавит требуемые неявные преобразования, которые мне не хватает. Создание функции, которую вы предложили, по-прежнему потребует от меня изменить все вхождения 'Json.parse' в моем коде, и с этим я действительно не вижу большого преимущества просто добавлять' .as [JsObject] 'везде. –

ответ

0

Только что получил это. Хитрость заключается в том, чтобы удалить

import play.modules.reactivemongo.json._ 

и вместо того, чтобы использовать

import reactivemongo.play.json._ 

play.modules версия не обеспечивает OWriter идентичности.