簡體   English   中英

Freemarker 調用 static java 方法來自 java.lang.ZA0FAEF0851B4194C46F46Z 方法

[英]Freemarker call static java method from java.lang.Integer

我有個問題。 我想在 freemaker 模板中調用 static java 方法Integer.toHexString() 在我的代碼中,我實現了以下幾行:

....
cfg.setSharedVariable("Integer",BeansWrapper.getDefaultInstance().
                                getStaticModels().
                                get("java.lang.Integer");
....
);

我的模板看起來像這樣

<#list Items.iterator() as var>
  <#assign hex = Integer.toHexString(var) />
  ${hex}
</#list>

但是,如果我執行代碼,我會收到以下錯誤:

freemarker.core._TemplateModelException: An error has occurred when reading existing sub-variable "Integer"; see cause exception! The type of the containing value was: extended_hash+string (org.json.JSONObject wrapped into f.e.b.StringModel)

----
FTL stack trace ("~" means nesting-related):
    - Failed at: #assign hex = Integer.toHexString(var...  [in template "decToHex.ftl"...]

我究竟做錯了什么? 謝謝。

根據錯誤消息,您的數據模型(又名模板上下文)是org.json.JSONObject FreeMarker 不知道 API,但它發現JSONObject有一個get(String)方法,並嘗試使用它。 不幸的是,該get方法的行為不像Map風格的get(key) FreeMarker 首先調用JSONObject.get("Integer")來查看變量是否在數據模型中。 如果不是,它期望返回一個null ,然后會嘗試從更高的范圍(比如從那里共享變量)獲取它。 但是JSONObject.get(String)拋出JSONException而不是返回null ,這是您在錯誤日志中看到的(如果您查看整個堆棧跟蹤, JSONException應該作為原因異常存在)。

為了解決這個問題,你需要教 FreeMarker 如何處理JSONObject -s:

  1. 創建一個 class,我們稱之為JSONObjectAdapter ,它實現了TemplateHashModelEx2 (或者,更簡單的TemplateHashModel足以滿足基本用例)。 其中,在實現TemplateHashModel.get(String)時,必須調用JSONObject.has(key)來檢查密鑰是否存在,如果不存在,則返回null ,否則繼續調用JSONObject.get(key)

  2. 創建一個 class,我們稱之為DefaultObjectWrapperWithJSONSupport ,它擴展DefaultObjectWrapper 您的 class 應該用JSONObjectAdapter包裝JSONObject -s。

  3. 如果您已經配置了 FreeMarker(不是在每個模板處理之前),請將objectWrapper指定為DefaultObjectWrapperWithJSONSupport

正確執行上述操作有一些不明顯的事情,所以我強烈建議從這個例子開始: https://freemarker.apache.org/docs/pgui_datamodel_objectWrapper.html#pgui_datamodel_customObjectWrappingExample

上面鏈接的示例執行了上述 3 個步驟,但支持Tupple class,而不是JSONObject 那是一個TemplateSequenceModel ,而不是TemplateHashModel ,但除此之外必須做的事情非常相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM