0

私は最近、レガシー (JSF 1.2) プロジェクトを継承し、それを JSF 2.2 に準拠させる任務を負っています。私は経験豊富な JSF 開発者ではなく、Web 上のさまざまなアドバイスに従っています。私が直面している適切な解決策が見つからない問題の 1 つは、式言語パラメーターを介してメソッド バインディングをカスタム コンポーネントに渡すことです。以下に例を示します。

ブラウズ.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:custom="http://www.custom.com/jsf/custom">

<f:view>
    <head>
    <title>Title</title>
    </head>
    <body>
        <custom:condition test="#{MyBean.canView}">
            Some private data here
        </custom:condition>
    </body>
</f:view>
</html>

MyBean.java:

public class MyBean {
    public String canView() { return "true"; }
}

Conditional.java (custom:condition タグにマッピング):

public class Conditional extends UIComponentBase {

    <snip>

    private MethodBinding testBinding;

    public MethodBinding getTest() {
        return testBinding;
    }

    public void setTest(MethodBinding test) {
        testBinding = test;
    }

    public boolean test(FacesContext context) {
        boolean ret = true;
        if (testBinding != null) {
            try {
                Object o = testBinding.invoke(context, null);
                ret = o != null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

    <snip>

}

EL ハッシュ/中かっこをオフString"MyBean.canView"ままにし、それらをコンポーネントに連結し、MethodExpression. 以前の JSF 1.2 コードのように、Facelet で EL 式の評価を実行していないことは言うまでもありません。

何か不足していますか?この JSF 1.2 コードを JSF 2.2 にアップコンバートするにはどうすればよいですか?

編集:これは私の「ハック」です。より良い方法があることを願っています。

public class Conditional extends UIComponentBase {

    <snip>

    public boolean test(FacesContext context) {
        if (testBinding != null) {
            Object ret = null;
            try {
                ApplicationFactory factory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);      
                MethodExpression methodExpression = factory.getApplication().getExpressionFactory().createMethodExpression(
                FacesContext.getCurrentInstance().getELContext(), 
                    "#{" + testBinding + "}", Boolean.class, new Class[] {});
                ret =   methodExpression.invoke(FacesContext.getCurrentInstance().getELContext(), null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (ret == null) return false;
        }
        return true;
    }

    <snip>

}
4

0 に答える 0