Play 2.8.18返回分块响应时出现编译错误
Play框架分块响应自定义Case Class编译错误解决
问题描述
我在Play框架中尝试分块响应功能,以下控制器代码可正常运行:
def chunkedSample = Action { val source = Source.apply(List("Hello","Hai")) Ok.chunked(source) }
但当我将List中的对象改为自定义case class后:
def chunkedSample = Action { val source = Source.apply(List(Dummy("hello"))) Ok.chunked(source) }
其中Dummy case class定义如下:
case class Dummy(hello:String)
出现编译错误:
No implicit found for parameter writable:Writable[Dummy]
我尝试在伴生对象中添加Json格式及Writes,但问题仍未解决:
object Dummy{ implicit val write = Json.writes[Dummy] }
问题原因
Ok.chunked 要求流中的元素必须有对应的 Writable 隐式实例,用于将元素转换为HTTP响应体的字节流。你添加的 Json.writes[Dummy] 是 Writes[Dummy](负责将对象序列化为Json结构),但它不等于Play HTTP需要的 Writable[Dummy],因此编译器找不到合适的隐式参数。
解决办法
有两种可行的解决方式:
方式一:将流中对象转为Json字符串
直接在Source里把Dummy对象序列化为Json字符串,复用Play内置的 Writable[String]:
def chunkedSample = Action { import play.api.libs.json.Json val source = Source(List(Dummy("hello"))).map(dummy => Json.toJson(dummy).toString()) Ok.chunked(source) }
方式二:定义Writable[Dummy]隐式实例
在Dummy的伴生对象中,基于已有的Json Writes直接实现Writable[Dummy]:
import play.api.http.Writable import play.api.libs.json.Json case class Dummy(hello: String) object Dummy { implicit val writes = Json.writes[Dummy] implicit val writable: Writable[Dummy] = Writable(dummy => Json.toJson(dummy).toString().getBytes()) }
这样编译器就能找到Dummy对应的Writable隐式实例,Ok.chunked即可正常编译运行。
内容的提问来源于stack exchange,提问作者Bill Goldberg
相关产品推荐
相关产品推荐

