[英]Method showString([class java.lang.Integer, class java.lang.Integer, class java.lang.Boolean]) does not exist in PySpark
[英]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:
創建一個 class,我們稱之為JSONObjectAdapter
,它實現了TemplateHashModelEx2
(或者,更簡單的TemplateHashModel
足以滿足基本用例)。 其中,在實現TemplateHashModel.get(String)
時,必須調用JSONObject.has(key)
來檢查密鑰是否存在,如果不存在,則返回null
,否則繼續調用JSONObject.get(key)
。
創建一個 class,我們稱之為DefaultObjectWrapperWithJSONSupport
,它擴展DefaultObjectWrapper
。 您的 class 應該用JSONObjectAdapter
包裝JSONObject
-s。
如果您已經配置了 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.