我正在使用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
答案 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
评估为foo
且application.yml
中的设置也为foo
,则表示一切正常。这是最常见的情况,因为通常您的应用程序名称在两个地方都是相同的。
如果info.app.name
和Gradle project.name
不匹配,您可以解决视图无法解决的问题。
您有两种方法可以解决此问题。一种是修改build.gradle
以明确指定包名称:
compileGsonViews.packageName = 'foo'
然后确保info.app.name
与该值匹配。
第二个选项是重命名项目目录,以便info.app.name
和project.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