2012-03-19 12 views
27

新しいPrimeFacesバージョンを使用するようにJava EE Webアプリケーションをアップグレードしました。PrimeFaces commandlinkのアクション属性でオーバーロードされたBeanメソッドの呼び出しが突然機能しなくなりました。 JSFのデフォルトのコマンドリンクを使ってテストしようとしましたが、これもうまくいきませんでした。次のようにELはオーバーロードされたメソッドをサポートしていますか?

メソッドのシグネチャは以下のとおりです。それは、常により多くの好奇心B.

にキャストしようとした

public void updateA(B b); 
public void updateA(A a); 

、それはどのようにアップグレードする前に仕事ができますか?

答えて

32

ELはサポートしていません。これは常に、ELメソッド呼び出しと名前(および引数の量)が一致する配列の最初のメソッドになります(Class#getMethods())。毎回同じメソッドを返すかどうかは、使用されるJVMのmake/versionに依存します。おそらくあなたはその間にJava SEのアップグレードを行いました。 javadocは次のようにも言います。

返される配列の要素はソートされず、特定の順序ではありません。

不特定の動作に頼るべきではありません。彼らに別の名前をつけてください。

+0

あなたの説明は今や明確になります – djmj

+1

これはJSF 2でこれ以上サポートされていない(技術的な)理由はありますか?私はこれがJSF 1.xのバージョンで可能だったと確信していますね。 – MrD

+0

これはJSF固有のものではありません。 – BalusC

5

これを回避する方法は、汎用メソッドを作成し、そのメソッド内で 'ルーティング'を行うことです。私はこれが理想的ではないかもしれないが、関数とXHTMLページの設定が少なくて済むことを知っている。

if (A.class.isInstance(obj)) { 
    A o = (A) obj; 
    return method(o, highRes); 
} else if (B.class.isInstance(obj)) { 
    B o = (B) obj; 
    return method(o, highRes); 
} else if (C.class.isInstance(obj)) { 
    C o = (C) obj; 
    return method(o, highRes); 
} else { 
    throw new FacesException("Unsupported Conversion: " + obj); 
} 
関連する問題