java - 如何在 FTL 中迭代 TreeMap 列表

标签 java multithreading jakarta-ee jvm freemarker

我正在尝试编写代码来使用 FTL 生成 JVM 线程转储,但在迭代 TreeMap 时遇到问题。

这是我的操作类的片段:

-----开始------

public AppsnapAction() {
    traces = new TreeMap<Thread, StackTraceElement[]>(COMP);
    traces.putAll(Thread.getAllStackTraces());
}

有问题的方法。

public Map<Thread, StackTraceElement[]> getAppTraces() {
 //  log.debug("HelloMe..in getAppTraces"+ traces);
    return traces;
}

----结束--------

这是 FTL 的片段:

-----开始-----

<h1>My Trace</h1>
<#list appTraces?keys as trace>
<h4><a name="${trace_index}">${trace}</a></h4>
<pre>
<#list appTraces[trace] as traceline>
   at ${traceline}
</#list>
</pre>
    </#list>

------结束------

代码在这一行中断: “<#list appTraces[trace] 作为跟踪线>”

但以下情况除外:

2013-09-15 22:58:35,701 [http-8080-1] 错误 freemarker.runtime -

get(Thread[ContainerBackgroundProcessor[StandardEngine[Catalina]],5,main]) 在 java.util.TreeMap 实例上失败 有问题的指令:

<小时/>

==> 将 appTraces[trace] 列为跟踪线 [位于/resources/templates/td-Page.ftl 中第 42 行第 5 列]

<小时/>

程序员的 Java 回溯:

<小时/>
freemarker.template.TemplateModelException: get(Thread[ContainerBackgroundProcessor[StandardEngine[Catalina]],5,main]) failed on instance of java.util.TreeMap
at freemarker.ext.beans.BeanModel.get(BeanModel.java:223)
at freemarker.core.DynamicKeyName.dealWithStringKey(DynamicKeyName.java:136)
at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:94)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
at freemarker.core.Environment.visit(Environment.java:213)
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Thread
at com.jivesoftware.helloworld.action.AppsnapAction$1.compare(AppsnapAction.java:1)
at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:351)
at java.util.TreeMap.getEntry(TreeMap.java:322)
at java.util.TreeMap.get(TreeMap.java:255)
at freemarker.ext.beans.MapModel.invokeGenericGet(MapModel.java:127)
at freemarker.ext.beans.BeanModel.get(BeanModel.java:185)
... 202 more

关于如何迭代内循环有什么想法吗?

最佳答案

您刚刚遇到了 FreeMarker 最大的烦恼之一:[]运算符不支持非字符串键,至少在 FreeMarker 2.4 之前是这样。因此,在此之前,最简单的解决方法可能是将对象包装器更改为 BeansWrappersimpleMapWrapper在。就像,new BeansWrapper(); bw.setSimpleMapWrapper(true); Configuration.setObjectWrapper(bw); 。这个包装器提供了这个黑客:appTraces(trace)myMap[stringKey]myMap.foo仍然会工作。缺点是,如果您已经有很多模板,其中一些模板可能会损坏,因为数据模型现在看起来略有不同。或者有很多不同,具体取决于您现在使用的对象包装器...无论如何,如果您来自默认的对象包装器,它通常不会破坏任何内容,除非您的数据模型中有 XML。

关于java - 如何在 FTL 中迭代 TreeMap 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818057/

相关文章:

java - 如何使用用户的证书?

ios - 使用GCD,但从服务器加载图像时我的应用仍然卡住

ios - 核心数据对象的顺序改变,核心数据合并后上下文之间不同

jakarta-ee - 在添加 wlfullclient.jar 之前,JAX-WS Dispatch 客户端工作正常

java - 如何将图像数组传递给 JSONObject?

java - 如何获取事件单击“确定”对话框

java - Websockets 无法在 Google Compute Engine 上部署的 Tomcat 服务器上运行

java - 一个棘手的死锁示例

c++ - 从 void 方法启动线程

javax.命名.NameNotFoundException : Unable to connect to derby database