【问题标题】:Json Views template not found when run as a war file作为war文件运行时找不到Json Views模板
【发布时间】:2016-11-20 18:59:44
【问题描述】:

我正在使用 Grails 的 Json 视图插件。这在开发中有效,但是当我将它作为 jar 文件运行时,它无法找到用于渲染的模板/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 视图是我们正在开发的内联插件的一部分。我们创建的 Jar 也使用该内联插件运行(使用 gradle 包装器实现)

有什么想法/建议吗?

环境: 圣杯 - 3.2.0 时髦的 - 2.4.7 Json-Views 插件 - 1.1.1

【问题讨论】:

    标签: grails deployment embedded-tomcat-8


    【解决方案1】:

    视图被预编译成类,以便通过 Gradle 和 compileGsonViews 任务进行部署。这是默认使用project.name 设置完成的。

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

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

    这意味着如果在 Gradle 中您的 project.name 计算结果为 foo 并且 application.yml 中的设置也是 foo 那么一切都很好。这是最常见的情况,因为通常您的应用程序名称在两个地方都相同。

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

    您有两种选择来解决此问题。一种是修改build.gradle明确指定包名:

     compileGsonViews.packageName = 'foo'
    

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

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

    【讨论】:

      【解决方案2】:

      Json View 行为在 dev 模式和 war 模式下是不同的。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2020-07-06
        • 2013-06-13
        • 1970-01-01
        • 2014-12-04
        相关资源
        最近更新 更多