0

我目前正在将我们的应用程序从 Webwork 升级到 Struts2。今天我遇到一个奇怪的错误:升级后 displayTag 停止工作。

这是从我的 FTL 文件中截取的:

<#assign display=JspTaglibs["http://displaytag.sf.net"]>

<@s.set name="entries" value="historyEntries" scope="page"/>

<@display.table class="data" name="pageScope.entries" sort="list"
      pagesize=30 id="entry" defaultsort=5 defaultorder="descending">
  <@display.column property="folderName" title="文件夹" sortable=true/>
</@display.table>

我得到的错误是:

freemarker.template.TemplateModelException:   
javax.servlet.jsp.JspException:异常:   
[.LookupUtil] 查找属性“folderName”时出错
在对象类型“freemarker.template.SimpleSequence”中。
原因:未知属性“文件夹名称”

标准的 struts 标签工作正常,我已JspSupportServlet在我的配置中添加。任何想法为什么这不起作用?

4

2 回答 2

0

我找到了解决这个问题的方法(不确定它是唯一的方法还是最好的方法,但对我有用)。

问题的根源在于freemarker.template.SimpleSequence没有开箱即用地实现任何标准的 Collections API,它不是 Collection、Enumerable 等。

为了解决这个问题,我创建了自定义FreemarkerManager并提供了自定义BeansWrapper

@覆盖
受保护的 BeansWrapper getObjectWrapper() {
    BeansWrapper 包装器 = super.getObjectWrapper();
    类 CustomBeansWrapper 扩展 BeansWrapper {
        私有 BeansWrapper internalWrapper;

        公共 Xp2BeansWrapper(BeansWrapper 包装器){
            this.internalWrapper = 包装器;
        }

        //委托方法


        公共模板模型包装(对象对象)抛出 TemplateModelException {
            TemplateModel 模型 = internalWrapper.wrap(object);
            如果(模型实例SimpleSequence){
                类 SimpleSequenceWithIterator 扩展 SimpleSequence {
                    私有 SimpleSequence 内部序列;
                    公共 SimpleSequenceWithIterator(SimpleSequence 序列) {
                        this.internalSequence = 序列;
                    }

                    //委托方法

                    //内部使用来自 Apache Commons 的 IteratorUtils
                    //通过DisplayTag库,可以使用public iterator()方法
                    公共迭代器 iterator() 抛出 TemplateModelException {
                        返回到列表()。迭代器();
                    }

                }
                返回新的 SimpleSequenceWithIterator((SimpleSequence) 模型);
            }
            返回模型;
        }


    }
    return new CustomBeansWrapper(wrapper);

}

现在我只需要更改一个设置struts.properties

struts.freemarker.manager.classname=xyz.CustomFreemarkerManager
于 2010-07-15T13:16:17.350 回答
0

您还可以验证您的部署是否将所有依赖项复制到 WEB-INF/lib。TaglibFactory 在 /META-INF/ 里面的 jar 下搜索每个 TLD。

看看https://stackoverflow.com/a/37092269/1113510

于 2016-05-07T18:42:27.410 回答