Tomcat 7.0.57 上的 Grails 3.3.0
Grails 3.3.0 on Tomcat 7.0.57
我们正在尝试在 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 规范?但是Tomcat7不支持3.1,只支持3.0。但是,我们通过在依赖项中执行此操作将 Grails 应用程序定位到我们正在部署的 Tomcat 版本:
provided "org.springframework.boot:spring-boot-starter-tomcat"
而这个,稍后在 build.gradle 文件中:
war {
ext['tomcat.version'] = '7.0.57'
}
还有什么要尝试的吗?
原来问题是由 Groovy 加载 class OnCommittedResponseWrapper 时的自省引起的,它具有以下内容:
public void setWriteListener(WriteListener writeListener) {
this.delegate.setWriteListener(writeListener);
}
将@GrailsCompileStatic 添加到以如下方式使用响应输出流的方法:
response.outputStream << someBytes
将避免内省,然后使其在 Tomcat 7.
上工作
我们正在尝试在 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 规范?但是Tomcat7不支持3.1,只支持3.0。但是,我们通过在依赖项中执行此操作将 Grails 应用程序定位到我们正在部署的 Tomcat 版本:
provided "org.springframework.boot:spring-boot-starter-tomcat"
而这个,稍后在 build.gradle 文件中:
war {
ext['tomcat.version'] = '7.0.57'
}
还有什么要尝试的吗?
原来问题是由 Groovy 加载 class OnCommittedResponseWrapper 时的自省引起的,它具有以下内容:
public void setWriteListener(WriteListener writeListener) {
this.delegate.setWriteListener(writeListener);
}
将@GrailsCompileStatic 添加到以如下方式使用响应输出流的方法:
response.outputStream << someBytes
将避免内省,然后使其在 Tomcat 7.
上工作