Freemarker模板引擎:解決NonHashException,正確比較字符串

Freemarker模板引擎:解決NonHashException,正確比較字符串

本文旨在解決在使用apache Freemarker模板引擎時,遇到的freemarker.core.NonHashException: Expected a hash, but this has evaluated to a String 錯誤。通過分析問題原因,提供使用Freemarker比較字符串的正確方法,幫助開發者避免類似錯誤,提升開發效率。

問題分析

在使用Freemarker模板引擎時,你可能會遇到如下錯誤:

freemarker.core.NonHashException: For "." left-hand operand: Expected a hash, but this has evaluated to a string (wrapper: f.t.SimpleScalar): ==> previousSearch.status  [in template "ticket/search.ftlh" at line 22, column 66]

這個錯誤通常發生在嘗試訪問一個字符串的屬性時,例如,使用.equals()方法。Freemarker認為.操作符是用來訪問哈希(類似于Java中的map對象)的屬性的,而你卻試圖在一個字符串上使用它。

例如,以下代碼可能會導致該錯誤:

<#if previousSearch.status.equals("ALL")>   ... </#if>

在這個例子中,previousSearch.status被認為是字符串,而.equals()方法是Java中字符串的方法,Freemarker并不直接支持這種用法。

解決方案:使用 == 比較字符串

在Freemarker中,比較字符串應該使用 == 操作符,而不是 .equals() 方法。

修改后的代碼如下:

<#if previousSearch.status == "ALL">   ... </#if>

這樣,Freemarker就能正確地比較字符串,避免NonHashException錯誤。

示例代碼

假設你有一個名為 ticketSearchForm 的對象,包含一個 status 屬性,你想根據 status 的值來設置 標簽的默認選項。

import lombok.Data;  @Data public class TicketSearchForm {     private String status = "ALL";     //More fields... }

Freemarker模板代碼如下:

<select name="status" id="status" class="form-control select2">   <option value="ALL" <#if ticketSearchForm.status == "ALL">selected</#if>>Alle anzeigen</option>   <option value="OPEN" <#if ticketSearchForm.status == "OPEN">selected</#if>>Offen</option>   <option value="DONE" <#if ticketSearchForm.status == "DONE">selected</#if>>Geschlossen</option> </select>

在這個例子中,我們使用 == 操作符來比較 ticketSearchForm.status 屬性的值,從而正確地設置 標簽的默認選項。

注意事項

  • Freemarker與Java的區別 務必記住,Freemarker與Java在處理字符串的方式上存在差異。不要將Java的習慣帶入Freemarker模板中。

  • 空值處理: 在比較字符串之前,最好先檢查變量是否為空。可以使用 ?has_content 指令來判斷變量是否存在且不為空。例如:

    <#if ticketSearchForm.status?? && ticketSearchForm.status == "ALL">   ... </#if>

    或者使用 ?default(”) 來設置默認值,避免空指針異常。

    <#if (ticketSearchForm.status?default('')) == "ALL">   ... </#if>
  • 其他數據類型 == 操作符也適用于比較其他數據類型,例如數字和布爾值。

總結

在使用Freemarker模板引擎時,正確理解其語法和特性至關重要。特別是字符串比較,要記住使用 == 操作符,而不是 .equals() 方法。通過本文的講解和示例,希望能幫助你解決NonHashException錯誤,編寫出更加健壯和可維護的Freemarker模板代碼。記住在比較之前進行判空處理,可以提高代碼的健壯性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享