运行为war文件时找不到Json Views模板

时间:2016-11-20 18:59:45

标签: grails deployment embedded-tomcat-8

我正在使用Json视图grails插件。哪个在开发中有效,但是当我将它作为jar文件运行时,它无法找到要渲染的templates / gson文件。我收到以下错误

//code 
    def template = jsonViewTemplateEngine.resolveTemplate(<path to template>)
            def writable = template.make(kase: kase)

//exception
    Cannot invoke method make() on null object. Stacktrace follows:
java.lang.NullPointerException: Cannot invoke method make() on null object

我们正在使用的Json Views是我们正在开发的内联插件的一部分。 Jar我们也创建了使用该内联插件运行(使用gradle包装器实现)

有任何想法/建议吗?

环境: Grails - 3.2.0 Groovy - 2.4.7 Json-Views插件 - 1.1.1

2 个答案:

答案 0 :(得分:1)

通过Gradle和compileGsonViews任务将视图预编译到类中进行部署。默认情况下,使用project.name设置完成此操作。

您将在build/main/gson-classes目录中注意到生成的类。例如,如果您的应用程序名称为foo,则会有foo_book_show_gson.class类,其中foo_部分被视为“包”名称。

在运行时。用于解析根据info.app.name中的grails-app/conf/application.yml设置计算的视图的程序包名称。

这意味着,如果在Gradle中,您的project.name评估为fooapplication.yml中的设置也为foo,则表示一切正常。这是最常见的情况,因为通常您的应用程序名称在两个地方都是相同的。

如果info.app.name和Gradle project.name不匹配,您可以解决视图无法解决的问题。

您有两种方法可以解决此问题。一种是修改build.gradle以明确指定包名称:

 compileGsonViews.packageName = 'foo'

然后确保info.app.name与该值匹配。

第二个选项是重命名项目目录,以便info.app.nameproject.name对齐。

答案 1 :(得分:0)

在开发模式和战争模式下,Json View行为有所不同。

WritableScriptTemplate template
if (Environment.isDevelopmentEnvironmentAvailable()) {
    template = attemptResolvePath(path)
    if (template == null) {
        template = attemptResolveClass(path)
    }
} else {
    template = attemptResolveClass(path)
    if (template == null) {
        template = attemptResolvePath(path)
    }
}
if (template == null) {
    template = NULL_ENTRY
}

在开发模式下,grails将首先按文件路径加载模板,然后按类名加载 如果您正在处理不区分大小写的文件系统,那么模板文件就像 'your_template_name'和'YOUR_TEMPLATE_NAME'将被视为相同。
但是类名称区分大小写,'your_template_name_class'和'YOUR_TEMPLATE_NAME_CLASS'不同;

也许您的模板文件名不正确。

例如,如果您的类名是:

QueryResult

您的模板文件应位于:

/views/queryResult/_queryResult.gson

Json View将搜索类:

<Project-Name>_queryResult__queryResult_gson