【问题标题】:File stream could not be created after deploying war in Grails 3在 Grails 3 中部署战争后无法创建文件流
【发布时间】:2021-12-22 09:33:02
【问题描述】:

我的代码最后进入 else 块,并在战争模式下(部署到 tomcat)记录“找不到文件”,但在开发模式下,在调用方法时使用相同的参数可以正常工作。该文件存在于 grails 3 默认文件结构中 = grails-app/i18n/messages.properties

def index= {
        log.debug params.id

        def f = new File("grails-app/i18n/${params.id}")
        log.info("i18n Controller ---" + f.toString())
        InputStream stream = null
        if (f.exists()) {
            stream = new FileInputStream("grails-app/i18n/${params.id}")
        } else {
            ServletContext sc = grailsApplication.parentContext.servletContext
            def res = sc.getResource("/WEB-INF/grails-app/i18n/${params.id}")
            if (res) {
                stream = sc.getResourceAsStream("/WEB-INF/grails-app/i18n/${params.id}")
            }
        }
        if (stream) {
            log.debug "Streaming"
            render stream.text
        } else {
            log.debug "Not found"
            render '#Message bundle not found'
        }
    }

造成这种不同行为的原因可能是什么?

【问题讨论】:

    标签: java file tomcat grails groovy


    【解决方案1】:

    造成这种不同行为的原因可能是什么?

    grails-app/i18n/${params.id}

    除非您在部署中做了一些不寻常的事情,否则该路径将不存在,f.exists() 将评估为false

    如果您问另一个关于如何访问 messages.properties 中的值的问题,有很多方法可以做到这一点,但没有充分的理由尝试从该路径加载资源。

    【讨论】:

    • @rishav-jain 如果你能清楚地表达你想要完成的事情,那将会有所帮助。从您的示例看来,您希望将名称为 grails-app/i18n/42 的文件的内容写入 HTTP 响应。在您的开发环境中,没有充分的理由对位于grails-app/i18n/ 下的文件执行此操作。应该在哪里定义文件取决于它是什么以及为什么要将其内容写入响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多