0

我有一个 ScalatraServlet 如下:

class MyServlet extends ScalatraServlet with FutureSupport with GZipSupport with JacksonJsonSupport {
..
}

运行时,我得到:

java.lang.IllegalStateException: STREAM

我还尝试在我的 ScalatraBootstrap 中添加一个码头过滤器,如下所示:

val gzip = context.addFilter("gzip-responses", classOf[NicsGzipFilter])
gzip.setInitParameter("mimeTypes", "text/html,text/plain,text/xml,application/json,application/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml")
gzip.setInitParameter("minGzipSize", "1") // TODO for testing only. Remove before committing
gzip.addMappingForUrlPatterns(java.util.EnumSet.allOf(classOf[DispatcherType]), true, "/*")
gzip.setAsyncSupported(true) // not sure if this is required?

在这种情况下,我得到了响应,但它们没有被压缩(尽管码头过滤器肯定会运行,因为它添加了一个可变编码标头)。

我似乎遇到了与此处报告的错误相同的错误:ScalatraServlet with AkkaSupport with GZipSupport。所以看起来这个错误并没有被修复。

关于它为什么不起作用的另一个建议是在这里提出的:https ://github.com/scalatra/scalatra/issues/247#issuecomment-12219667 。建议是 Scalatra 在同一响应中使用写入器和输出流调用输出,这是不允许的。

有小费吗?

谢谢。

4

1 回答 1

0

在 IRC 上与 rossabaker 聊天,在提交了一个复制问题的示例应用程序后,他发现了问题并提出了解决方案:https ://github.com/scalatra/scalatra/pull/316 。

事实证明,FutureSupport trait 不尊重 GZipFilter 生成的响应包装器。

于 2013-10-01T13:27:11.320 回答