1

I am using Json views plugin of grails. Which works in development, but when I run it as a jar file, it is not able to find the templates/gson files for rendering. I get the following error

//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 we are using are a part of a inline plugin we are developing. Jar we create also runs with that inline plugin (implemented using gradle wrapper)

Any ideas/suggestions?

Environment: Grails - 3.2.0 Groovy - 2.4.7 Json-Views plugin - 1.1.1

4

2 に答える 2

2

compileGsonViewsビューは、Gradle とタスクを介して展開するために、クラスに事前にコンパイルされています。これはproject.name、デフォルトの設定を使用して行われます。

build/main/gson-classes作成されたクラスがディレクトリに表示されます。たとえば、アプリケーション名がの場合、その部分が「パッケージ」名と見なされるfooようなクラスがあります。foo_book_show_gson.classfoo_

実行時。info.app.nameの設定から計算されたビューを解決するために使用するパッケージ名grails-app/conf/application.yml

これが意味することは、Gradle でproject.name評価されfoo、設定application.ymlもであるfoo場合、すべてがうまくいっているということです。通常、アプリケーション名は両方の場所で同じであるため、これは最も一般的なケースです。

info.app.nameと Gradleproject.nameが一致しない場合、ビューが解決されないという問題が発生する可能性があります。

これを修正するには、2 つのオプションがあります。build.gradle1 つは、パッケージ名を明示的に指定するように変更することです。

 compileGsonViews.packageName = 'foo'

次に、info.app.nameその値と一致することを確認します。

2 番目のオプションは、プロジェクト ディレクトリの名前を変更してinfo.app.name整列project.nameさせることです。

于 2016-11-23T14:55:21.260 に答える
0

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
于 2017-12-02T03:00:36.000 に答える