![](/img/trans.png)
[英]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.