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="降順">
  <@display.column property="folderName" title="フォルダ" sortable=true/>
</@display.table>

私が得るエラーは次のとおりです。

freemarker.template.TemplateModelException:   
javax.servlet.jsp.JspException: 例外:   
[.LookupUtil] プロパティ「folderName」の検索エラー
オブジェクトタイプ「freemarker.template.SimpleSequence」。
原因: 不明なプロパティ'folderName'です

標準の struts タグは正しくJspSupportServlet機能しています。構成に追加しました。なぜこれが機能しないのか考えていますか?

4

2 に答える 2

0

これを解決する方法を見つけました(それが唯一の方法なのか、それが最善なのかはわかりませんが、うまくいきました)。

問題の根本は、freemarker.template.SimpleSequenceすぐに使用できる標準のコレクション API を実装していないことでした。これは、コレクション、列挙可能などではありません。

これを解決するために、私はカスタムを作成し、カスタムFreemarkerManagerを提供しましたBeansWrapper:

@オーバーライド
保護された BeansWrapper getObjectWrapper() {
    BeansWrapper ラッパー = super.getObjectWrapper();
    class CustomBeansWrapper は BeansWrapper を拡張します {
        プライベート BeansWrapper internalWrapper;

        public Xp2BeansWrapper(BeansWrapper ラッパー) {
            this.internalWrapper = ラッパー;
        }

        //デリゲート メソッド


        public TemplateModel wrap(Object object) は TemplateModelException をスローします {
            TemplateModel モデル = internalWrapper.wrap(オブジェクト);
            if (SimpleSequence のモデル インスタンス) {
                class SimpleSequenceWithIterator extends SimpleSequence {
                    プライベート SimpleSequence internalSequence;
                    public SimpleSequenceWithIterator(SimpleSequence シーケンス) {
                        this.internalSequence = シーケンス;
                    }

                    //デリゲート メソッド

                    //Apache Commons の IteratorUtils が内部的に使用されます
                    //DisplayTag ライブラリにより、public iterator() メソッドを使用できます
                    public Iterator iterator() は TemplateModelException をスローします {
                        return toList().iterator();
                    }

                }
                return new SimpleSequenceWithIterator((SimpleSequence) モデル);
            }
            モデルを返します。
        }


    }
    新しい CustomBeansWrapper(wrapper) を返します。

}

ここで、次の 1 つの設定を変更する必要がありましたstruts.properties

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

また、デプロイメントがすべての依存関係を WEB-INF/lib にコピーするかどうかを証明することもできます。TaglibFactory は、jar 内の /META-INF/ の下にあるすべての TLD を検索します。

https://stackoverflow.com/a/37092269/1113510をご覧ください

于 2016-05-07T18:42:27.410 に答える