ホームページ > Java > &#&チュートリアル > SpringbootにFreeMarkerを統合する際のエラーを解決する方法

SpringbootにFreeMarkerを統合する際のエラーを解決する方法

PHPz
リリース: 2023-05-19 16:43:22
転載
4529 人が閲覧しました

springboot統合フリーマーカー踩坑

报错

2021-04-23 02:01:18.148 エラー 9484 --- [nio-8080-exec-1] o.a.c.c.C.[ .[.[/].[dispatcherServlet] : パス [] のコンテキスト内のサーブレット [dispatcherServlet] の Servlet.service() が例外をスローしました [リクエスト処理が失敗しました。ネストされた例外は freemarker.core.InvalidReferenceException です: 以下は null または欠落と評価されました:
==> hots [テンプレート "inc/right.ftl" の行 6、列 11]

----
ヒント: 失敗した式が、null または欠落しているものを正当に参照していることがわかっている場合は、 myOptionalVar!myDefault のようなデフォルト値を指定するか、when-presentwhen-missing#if> を使用します。 (これらは式の最後のステップのみをカバーします。式全体をカバーするには、かっこを使用します: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

-- --
FTL スタック トレース (「~」はネスト関連を意味します):
- 失敗しました: @hots [テンプレート "inc/right.ftl" の行 6、列 9]
- 到達しました: #include "/inc/right.ftl" [テンプレート "index.ftl" の行 52、列 13]
~ 到達: #nested [テンプレート "inc/layout.ftl" マクロ "layout" 25 行目、5 列目]
~ 到達: @layout "首页" [テンプレート "index.ftl" の 2 行目、1 列目]
----] 根本原因

# #freemarker.core.InvalidReferenceException: 以下は null または欠落と評価されました:

==> hots [テンプレート "inc/right.ftl" の行 6、列 11]

--- -

ヒント: 失敗した式が、null または欠落しているものを正当に参照していることがわかっている場合は、myOptionalVar!myDefault のようなデフォルト値を指定するか、when-present。 (これらは式の最後のステップのみをカバーします。式全体をカバーするには、かっこを使用します: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

--------
FTL スタック トレース (「~」はネスト関連を意味します):
- 失敗しました: @hots [テンプレート "inc/right.ftl" の行 6、列 9]
- 到達: #include "/inc/right.ftl" [テンプレート "index.ftl" の行 52、列 13]
~ 到達: #nested [テンプレート "inc/layout.ftl"マクロ「layout」の行 25、列 5]
~ 到達: @layout "首页" [テンプレート「index.ftl」の行 2、列 1]
----
at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) ~[freemarker-2.3.28.jar:2.3.28]
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106) ~[freemarker- 2.3.28.jar:2.3.28]
freemarker.core.Environment.visit(Environment.java:330) ~[freemark-2.3.28.jar:2.3.28]
freemarker.core で。 Environment.visit(Environment.java:336) ~[freemark-2.3.28.jar:2.3.28]
at freemarker.core.Environment.include(Environment.java:2582) ~[freemark-2.3.28. jar:2.3.28]
freemarker.core.Include.accept(Include.java:171) ~[freemark-2.3.28.jar:2.3.28]
freemarker.core.Environment.visit( Environment.java:366) ~[freemarker-2.3.28.jar:2.3.28]
freemarker.core.Environment.invokeNestedContent(Environment.java:618) ~[freemark-2.3.28.jar:2.3. 28]
freemarker.core.Bodystruction.accept(Bodystruction.java:60) ~[freemark-2.3.28.jar:2.3.28]
freemarker.core.Environment.visit(Environment.java: 366) ~[freemarker-2.3.28.jar:2.3.28]
freemarker.core.Environment.invoke(Environment.java:775) ~[freemark-2.3.28.jar:2.3.28]
freemarker.core.UnifiedCall.accept(UnifiedCall.java:83) ~[freemark-2.3.28.jar:2.3.28]
freemarker.core.Environment.visit(Environment.java:330) ~[ freemarker-2.3.28.jar:2.3.28]
freemark.core.Environment.visit(Environment.java:336) ~[freemark-2.3.28.jar:2.3.28]
freemark にあります。 core.Environment.process(Environment.java:309) ~[freemarker-2.3.28.jar:2.3.28]
freemark.template.Template.process(Template.java:384) ~[freemark-2.3. 28.jar:2.3.28]
org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:389) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1. 4.RELEASE]
org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:302) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:253) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:178) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web。 servlet.view.AbstractView.render(AbstractView.java:316) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.render( DispatcherServlet.java:1370) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116) ~[ spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055) ~[spring-webmvc-5.1.4. RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4. RELEASE]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org. springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at javax.servlet.http.HttpServlet.service( HttpServlet.java:634) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring- webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.14.jar:] 9.0.14]
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.tomcat.websocket.server で.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0] .14.jar:9.0.14]
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE] ]
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.apache .catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain .java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web] -5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar] :5.1.4.RELEASE]
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.springframework.web.filter.HiddenHttpMethodFilter で.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core] -9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14] ]
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.springframework .web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat] -embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.14.jar] :9.0.14]
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org で.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:139) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat] -embed-core-9.0.14.jar:9.0.14]
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.14.jar] :9.0.14]
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org で.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight .java:66) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) ~[tomcat-embed] -core-9.0.14.jar:9.0.14]
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) ~[tomcat-embed-core-9.0.14] .jar:9.0.14]
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java) :628) ~[na:na]
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.14.jar:9.0] .14]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2021-04-23 02:01:18.177 エラー 9484 - -- [nio-8080-exec-1] s.e.ErrorMvcAutoConfiguration$StaticView : リクエスト [/] および例外のエラー ページをレンダリングできません [次は null または欠落と評価されました:
==> hots [テンプレート "inc/right.ftl" の行 6、列 11]

----
ヒント: 失敗した式が、null または欠落しているものを正当に参照していることがわかっている場合は、 myOptionalVar!myDefault のようなデフォルト値を指定するか、when-presentwhen-missing#if> を使用します。 (これらは式の最後のステップのみをカバーします。式全体をカバーするには、かっこを使用します: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

-- --
FTL スタック トレース (「~」はネスト関連を意味します):
- 失敗しました: @hots [テンプレート "inc/right.ftl" の行 6、列 9]
- 到達しました: #include "/inc/right.ftl" [テンプレート "index.ftl" の行 52、列 13]
~ 到達: #nested [テンプレート "inc/layout.ftl" マクロ "layout"応答はすでにコミットされているため、行 25、列 5]
~ に到達しました: @layout "首页" [テンプレート "index.ftl" の行 2、列 1]
----]。その結果、応答に間違ったステータス コードが含まれる可能性があります。 、その後、台上で再制御され、結果は問題なく、ホット情報によって最初はフロントエンドの問題であると認識され、ホットは検出されませんでしたが、以前の同様の機能が比較され、その後、断続的な比較によって、ホットが検出されました。题です構成クラス。

#解決方法

再FreemarkerConfig は、@Autowired を介してテンプレートを入力し、その後、configuration.setSharedVariable(“hots”, hotsTemplate);を使用して、フロントエンドを

springboot freemarker ベース構成および使用

1.ベース構成

1.1 組み込み依存

<!-- 引入freemarker模板引擎的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
ログイン後にコピー

1.2 の application.properties 構成文件中追加の如く構成:

# 是否开启thymeleaf缓存,本地为false,生产建议为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.allow-request-override=false
spring.freemarker.check-template-location=true
#类型
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
#
#文件后缀
spring.freemarker.suffix=.ftl
#路径 .ftl文件就创建在templates下面或者子目录
spring.freemarker.template-loader-path=classpath:/templates/
ログイン後にコピー
SpringbootにFreeMarkerを統合する際のエラーを解決する方法2.ベース础使用

首先我在コントローラークラス中一测试インターフェイス使用、内容を以下のように写す

@Controller
public class FreeMarkerController {

    Map<String ,Object> map = new HashMap<>();
    List<Object> list = new ArrayList();
    @GetMapping("/freemaker/{id}/{name}")
    public String demo(@PathVariable("id")String id ,@PathVariable("name") String name,Model model){

        map.clear();
        map.put("id",id);
        map.put("name",name);
        list.add(2);
        list.add(4);
        map.put("aa",null);
        model.addAttribute("map",map);
        model.addAttribute("list",list);
        model.addAttribute("date",new Date());
        return "index";
    }
}
ログイン後にコピー

以下すべて变量都是有上面面提供

2.1用マップ型データ、本体型もこの形式型プロパティを使用できます

/*可直接获取id对应的v值*/
id:${map.id}
name:${map.name}
ログイン後にコピー

2.2セット用、セットセットこの形式を使用して、対応する要素を使用することもできます。

list01:${list[0]}
list02:${list[1]}
ログイン後にコピー

2.3 文字列接続の 2 つのメソッド

#
${"你好啊${map.name}"}
${"你好啊"+map.name}
ログイン後にコピー

2.4FreeMarker 表表示式でサポートされる「 」 、「-」、「*」、「/」、「%」运算符

${list[1]+list[0]}
${list[1]-list[0]}
${list[1]*list[0]}
${list[1]/list[0]}
${list[1]%list[0]}
ログイン後にコピー

2.5表式中サポートされる比较运算符有如下几种:

1. =(または者==):どちらかが相等であるか判断します;2. !=: 2 つの値が等しくないかどうかを判断します。

注: =and!= 文字列、数値、日単位の比較として使用できますが、両方のデータ型が同じである必要があります。また、FreeMarker の比較は厳密な比較である必要があります。

3. >(またはgt):4より大きい。 >=(またはgte):大以上等以上5。 <(またはlt):##6より小さい。 <=(または lte):

より小さい 注: 上で、これらの比較演算子は数字と日の場合に使用できますが、文字列には使用できません。 FreeMarker は、このような問題を回避するために、括弧を使用することができます。

2.6 時間の形式変更

${date?string("yyyy-MM-dd")}
ログイン後にコピー

2.7 のサポート計算表式


#FreeMarker は計算をサポートしていますが、布型の計算 2 つの値を比較計算する場合にのみ、引数の追加が必要です。通常は命令内で使用されます。

FreeMarker支持逻辑运算但是只支持布尔型逻辑运算两个值进行比较运算的的时候需要添加括号才能进行逻辑运算,一般用于指令中
1. &&: 逻辑与;
2. ||:逻辑或;
3. !:逻辑非
逻辑运算符只能用于布尔值。

2.8FreeMarker无法理解null值

FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
FreeMarker提供两个运算符来避免空值:
1.!运算
1.1若是msg不存在不报异常默认空值,若是不使用!会报异常

${msg!}
1.2若是存在则输出,若是不存在则默认为abc

${map.a!"abc"}

2.??返回布尔值一般用在指令中下面会有引用此处不解释

2.9 if指令

<#if map.aa?? >
    存在
    <#else >
    不存在
</#if>
<br>
<#if (list[0]>=3) >
    优秀
    <#elseif (list[0]>=2)>
    良好
    <#else >
    差劲
</#if>
ログイン後にコピー

2.10 list指令 遍历

<#list list as li>
    ${li}<br>
</#list>
ログイン後にコピー

以上がSpringbootにFreeMarkerを統合する際のエラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート