gpt4 book ai didi

spring - Grails应用程序response.outputStream <<由于升级到Grails 3.3而失败

转载 作者:行者123 更新时间:2023-12-02 14:29:07 26 4
gpt4 key购买 nike

我有一个Grails应用程序,最近已将其从2.5升级到3.3。总体而言,一切正常,但是今天我们遇到了一个似乎由他人共享的问题,但我找不到解决方案。

在 Controller 中,我有一个将字符串追加到response.outputStream的方法。

该代码现在显示为

    response.status = OK.value()
response.contentType = 'text/csv;charset=UTF-8'
response.setHeader "Content-disposition", "attachment; filename=rcCandidate.csv"
response.outputStream << converted
response.outputStream.flush()
response.outputStream.close()

根据此处的建议

http://sergiodelamo.es/grails-tips-how-to-output-csv-from-a-grails-3-controller/

这段代码可以在我的测试环境中正常执行
$ grails -version
| Grails Version: 3.3.5
| Groovy Version: 2.4.15
| JVM Version: 1.8.0_162

但在生产服务器上严重失败
$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

$ apt list | grep tomcat
tomcat7/trusty-security,trusty-updates,now 7.0.52-1ubuntu0.13 all [installed]

报告的失败开始于:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/WriteListener

然后是堆栈跟踪
Caused by: java.lang.NoClassDefFoundError: javax/servlet/WriteListener

然后更多的堆栈跟踪和有关WriteListener的类似消息

我已经看到替换此行的建议
provided "org.springframework.boot:spring-boot-starter-tomcat"


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

但正如这里指出的

https://docs.grails.org/latest/guide/deployment.html

那不是一个好主意,确实,当我尝试过它时,tomcat并没有启动。

我相信我读过某个地方,也许可以通过用Tomcat8替换Tomcat7来解决此问题。但是,现在我正在服务器上运行Ubuntu 14.04,并且存储库中没有提供Tomcat8,因此对其进行测试不是很简单。

有人对我有什么建议吗?提前致谢。

最佳答案

您可以通过在方法中添加@CompileStatic来解决此问题,但这并不总是可行的。通过添加静态实用程序方法,我们已在应用程序中解决了此问题:

@CompileStatic
public static sendResponseData(ServletOutputStream outputStream, String s) { // but this could be byte[] s or InputStream s or whatever you need
outputStream << s
}

然后调用它而不是左移操作。

您可能需要添加其他方法签名,以便可以静态编译它们,但概念相同。如果我没记错的话,这里的左移位运算符会使用一些注释或某些内容(显然我不记得详细信息!),这些注释或内容是默认情况下(在Tomcat 7上)不包括在内的,但也不需要。

请注意,我们还添加了
@CompileStatic
public static flushOutputStream(ServletOutputStream outputStream) {
outputStream.flush()
}

为方便起见,因为该对象也必须静态编译。

关于spring - Grails应用程序response.outputStream <<由于升级到Grails 3.3而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49990692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com