1

いくつかのリソース バンドルでプロパティを定義しました。これらは、faces-config.xml で構成されます。

<resource-bundle>
<base-name>webMessages</base-name>
<var>feBundle</var>
</resource-bundle>

次に、定義されていないプロパティにアクセスしようとします。

<tag infoText="#{feBundle['insurance.comparison.household.details.aicraftCrash.tooltip']}"

/>

プロパティが使用できない場合、javax.el.PropertyNotFoundException がスローされ、faces サーブレットが空白のページをレンダリングします。ResourceBundleELResolver のドキュメントによると、この例外はスローされないため、これは発生しないはずです。DemuxCompositeELResolver のリゾルバーの一部であることがわかりますが、呼び出されることはないようです。代わりに、MapELResolver (リゾルバーのリストで RBELResolver の後に配置される) が呼び出され、例外がスローされます。私は実際にその動作を何とかすることはできず、デバッグは面倒です。これを回避する方法がいくつかあるはずです。プロパティが見つからなくても、ページのレンダリング プロセス全体が中断されることはありません。何か案は?

注: これは、tomcat > 6 ディストリビューションで提供される javax.el ライブラリのみの問題です。

4

1 に答える 1

2

この問題をもう少し詳しく調べたところ、Tomcatディストリビューションにjavax.elパッケージが実装されていることが原因であることがわかりました。したがって、説明されている動作は、tomcat> 6を使用している場合にのみ発生します。これは実際のバグではなく、一種の望ましい(ただし、私見、醜い)動作であると主張できますが、バグ追跡ツールにバグレポートを提出しました。jsfの解決策も見つけました。

ResourceBundleELResolverをサブクラス化し、そのgetValue(...)メソッドをオーバーライドします。例外が発生する前にPropertyResolved属性をtrueに設定するように変更します。

 if (base instanceof ResourceBundle) {
        if (property != null) {
            try {
                context.setPropertyResolved(true);
                Object result = ((ResourceBundle) base).getObject(property
                        .toString());
                return result;
            } catch (MissingResourceException mre) {
                System.out.println("Missing property: " + property);
                return "?" + property.toString() + "?";
            }
        }
    }

このカスタムリゾルバーをfaces-config.xmlに登録します。

<el-resolver>your.package.TheResolverImplementation</el-resolver>

そしてバグレポートへのリンクhttps://issues.apache.org/bugzilla/show_bug.cgi?id=53001

于 2012-03-29T10:51:10.520 に答える