繁体   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