Tomcat 7.0.57 上的 Grails 3.3.0

标签 grails grails-controller grails-3.3

我们正在尝试在 Tomcat 7.0.57 下的 Grails 3.3.0 中使用 response.outputStream。但是,当任何字节写入流时,我们会收到此错误:

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/WriteListener

这似乎来自 3.1 Servlet 规范?但是Tomcat 7不支持3.1,只支持3.0。但是,我们通过在依赖项中执行此操作将 Grails 应用程序定位到我们要部署到的 Tomcat 版本:

provided "org.springframework.boot:spring-boot-starter-tomcat"

而这个,稍后在 build.gradle 文件中:

war {
   ext['tomcat.version'] = '7.0.57'
}

还有什么可以尝试的吗?

最佳答案

原来问题是由加载类 OnCommittedResponseWrapper 时的 Groovy 自省(introspection)引起的,它具有以下内容:

    public void setWriteListener(WriteListener writeListener) {
        this.delegate.setWriteListener(writeListener);
    }

将@GrailsCompileStatic 添加到以如下方式使用响应输出流的方法:

response.outputStream << someBytes

将避免内省(introspection),这使得它可以在 Tomcat 7 上运行。

关于Tomcat 7.0.57 上的 Grails 3.3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106614/

相关文章:

spring - 在Spring 3.0.5 jar中找不到SimpleMapScope

grails - 与messages.properties的参数有关的问题,除零以外的所有数字均可正常工作

grails - Grails, Bootstrap 上的其他包导致用户创建失败吗?

gradle - 没有父目录的Grails 3(Gradle)依赖项

grails - 在grails中上传PDF

jquery - Grails-合并来自多个域的数据并返回 Controller

grails - 在 Grails/GSP 选择元素中格式化 POJO

grails - Grails:服务与Groovy类

hibernate - 如何在Grails 3中覆盖DomainClass getter

css - 样式表上的 Grails NumberFormatException