Freemarker模板调用Integer.toHexString()报错,求助排查问题
问题分析与解决
错误原因
你的问题出在变量名冲突上:模板上下文(Items对象)中已经存在一个名为Integer的属性(是被包装成StringModel的org.json.JSONObject),它覆盖了你通过setSharedVariable注册的java.lang.Integer静态类引用。当模板访问Integer时,拿到的是这个JSON对象而非静态方法容器,因此调用toHexString会抛出异常。
解决方案
方案1:重命名共享变量
修改Java代码,给静态类引用换个不会冲突的名字,比如IntegerUtils:
cfg.setSharedVariable("IntegerUtils", BeansWrapper.getDefaultInstance() .getStaticModels() .get("java.lang.Integer"));
对应的模板代码调整为:
<#list Items.iterator() as var> <#assign hex = IntegerUtils.toHexString(var) /> ${hex} </#list>
方案2:使用Freemarker内置的statics指令
无需提前注册共享变量,直接在模板中通过statics获取java.lang.Integer的静态类:
<#list Items.iterator() as var> ${statics["java.lang.Integer"].toHexString(var)} </#list>
或者先赋值再调用:
<#assign IntegerClass = statics["java.lang.Integer"]> <#list Items.iterator() as var> <#assign hex = IntegerClass.toHexString(var) /> ${hex} </#list>
额外注意
确保var是数值类型(int/Integer),如果var是字符串类型,需要先转成数字:
${statics["java.lang.Integer"].toHexString(var?number)}
内容的提问来源于stack exchange,提问作者Brainjay
相关产品推荐
相关产品推荐

