web-dev-qa-db-ja.com

FreeMarkerテンプレートエラー:以下はnullまたは欠落していると評価されました|しかし、真実ではありません

私が直面しているエラーはとても奇妙です。すべて正常に見えますが、ブラウザーがサーバーにGET要求を送信すると、このエラーが発生します。私がやろうとしているのは、実際にHTTPパラメーターをキャッチし、それらをArrayListに保存されたオブジェクトに保存してFreemarkerテンプレートに送信することです。

手伝っていただけませんか?どうもありがとう。

エラー:

freemarker.log._JULLoggerFactory $ JULLoggerエラー重大:FreeMarkerテンプレートの実行中にエラーが発生しましたFreeMarkerテンプレートエラー:以下がnullまたは欠落していると評価されました:==> item.lat1 [テンプレート "view/result.ftl"の18行15列目]

freemarker.core.InvalidReferenceException:[...例外メッセージはすでに出力されています。上記を参照してください...] freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.Java:131)at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.Java:355)at freemarker.core.Expression.evalAndCoerceToString(Expression.Java: 82)freemarker.core.DollarVariable.accept(DollarVariable.Java:41)at freemarker.core.Environment.visit(Environment.Java:324)at freemarker.core.MixedContent.accept(MixedContent.Java:54)atfreemarker。 core.Environment.visitByHiddingParent(Environment.Java:345)at freemarker.core.IteratorBlock $ IterationContext.executeNestedBlockInner(IteratorBlock.Java:268)at freemarker.core.IteratorBlock $ IterationContext.executeNestedBlock(IteratorBlock.Java:220)atfreemarker.core。 .IteratorBlock $ IterationContext.accept(IteratorBlock.Java:194)at freemarker.core.Environment.visitIteratorBlock(Environment.Java:572)at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.Java:78)atfreemarker.core.IteratorBlock。フリーマークでaccept(IteratorBlock.Java:64) er.core.Environment.visit(Environment.Java:324)at freemarker.core.MixedContent.accept(MixedContent.Java:54)at freemarker.core.Environment.visit(Environment.Java:324)at freemarker.core.Environment .process(Environment.Java:302)at freemarker.template.Template.process(Template.Java:325)at spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.Java:71)at controller.App.lambda $ main $ 1 (App.Java:57)at spark.RouteImpl $ 1.handle(RouteImpl.Java:58)at spark.webserver.MatcherFilter.doFilter(MatcherFilter.Java:162)at spark.webserver.JettyHandler.doHandle(JettyHandler.Java:61 )org.Eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.Java:189)at org.Eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.Java:141)atorg.Eclipse.jetty。 server.handler.HandlerWrapper.handle(HandlerWrapper.Java:119)at org.Eclipse.jetty.server.Server.handle(Server.Java:517)at org.Eclipse.jetty.server.HttpChannel.handle(HttpChannel.Java: 302)org.Eclipse.jetty.server.HttpConnでorg.Eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded(AbstractConnection.Java:245)のection.onFillable(HttpConnection.Java:242)org.Eclipse.jetty.io.FillInterest.fillable(FillInterest.Java:95) org.Eclipse.jetty.io.SelectChannelEndPoint $ 2.run(SelectChannelEndPoint.Java:75)at org.Eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.Java:213)atorg.Eclipse.jetty。 util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.Java:147)at org.Eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.Java:654)at org.Eclipse.jetty.util.thread.QueuedThreadPool $ 3 .run(QueuedThreadPool.Java:572)at Java.lang.Thread.run(Thread.Java:745)

[qtp285763673-17]エラーspark.webserver.MatcherFilter-Java.lang.IllegalArgumentException:freemarker.core.InvalidReferenceException:以下はnullまたは欠落していると評価されました:==> item.lat1 [in template "view/result.ftl" at 18行15列]

..しかし本当です、なぜなら私は配列を印刷し、それはうまく機能するからです!

  final FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine();
    final Configuration freeMarkerConfiguration = new Configuration();
    freeMarkerConfiguration.setTemplateLoader(new ClassTemplateLoader(App.class, "/"));
    freeMarkerEngine.setConfiguration(freeMarkerConfiguration);

    get("/rest", (request, response) -> {
        Double lat1 = Double.parseDouble(request.queryParams("lat1") != null ? request.queryParams("lat1") : "anonymous");
        Double lon1 = Double.parseDouble(request.queryParams("lon1") != null ? request.queryParams("lon1") : "anonymous");
        Double lat2 = Double.parseDouble(request.queryParams("lat2") != null ? request.queryParams("lat2") : "anonymous");
        Double lon2 = Double.parseDouble(request.queryParams("lon2") != null ? request.queryParams("lon2") : "anonymous");

        if (shouldReturnHtml(request)) {
            response.status(200);
            response.type("text/html");
            Map<String, Object> attributes = new HashMap<>();
            attributes.put("list",loadTheList(lat1,lon1,lat2,lon2));
            return freeMarkerEngine.render(new ModelAndView(attributes, "/view/result.ftl"));
        }
        else {
            response.status(200);
            response.type("application/json");
            return null;
        }
    });


}

private static boolean shouldReturnHtml(Request request) {
    String accept = request.headers("Accept");
    return accept != null && accept.contains("text/html");
}
public static ArrayList<Bereken> loadTheList(double lat1, double lon1, double lat2, double lon2) {
    ArrayList<Bereken> list = new ArrayList<>();
    list.add(new Bereken(lat1,lon1,lat2,lon2));
    return list;
}

そしてresult.ftl:

      <#list list as item>
        <h2>${item.lat1}</h2>
        <h2>${item.lon1}</h2>
        <h2>${item.lat2}</h2>
        <h2>${item.lon2}</h2>
    </#list>
6
Aziz

Berekenクラスの1つのインスタンスを「リスト」に追加しています。したがって、Berekenクラスはパブリックプロパティlat1、lat2、lon1、lon2、または対応するゲッターメソッドを提供しないと思います。

1
J.K.Lauren

これは古い質問だと思いますが、私はこれにぶつかりました。 Freemarkerは、プライベートクラスのインスタンス(私が試したばかり)を渡すと、値が「nullまたは欠落している」と文句を言います。 Java Beanクラスを渡すと、必要publicになります。この場合、エラーメッセージは非常に誤解を招く可能性があります。

1
Alan47

私は昨日これに出くわしました。私はチュートリアルを行っていましたが、ステップの1つに、オブジェクトを作成したクラスのgetterメソッドのコードが含まれていませんでした。著者は、読者がそれがすでに起こっているはずだと知っていると思っていたと思います。

したがって、この「Bereken」がどこにあっても(JavaBeanクラスであることを知ったばかりです)、「list」の各要素に関連付けられたプロパティのsetterメソッドとgetterメソッドを必ず追加してください。

1
bsmither