2012-03-19 47 views
27

我升級了我的Java EE Web應用程序以使用更新的PrimeFaces版本,並且突然在PrimeFaces commandlink的操作屬性中重載的bean方法的調用不再有效。我試圖使用JSF默認命令鏈接來測試它,而這個也沒有工作。EL支持重載方法嗎?

的方法簽名如下:

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

它總是試圖投A到B.

更好奇,怎麼會在升級前工作?

回答

32

EL不支持它,沒有。它始終是Class#getMethods()數組的名字(和參數數量)與EL方法調用匹配的第一個方法。它是否每次都返回相同的方法取決於所使用的JVM make/version。也許您在此期間也進行了Java SE升級。 javadoc甚至說:

返回的數組中的元素沒有排序,也沒有任何特定的順序。

您不應該依賴未指定的行爲。給他們一個不同的名字。

+0

非常感謝,您的解釋讓事情變得清晰 – djmj 2012-04-26 03:28:15

+1

JSF 2中不再支持這種技術嗎?我很確定這在JSF 1.x版本中是可行的,不是嗎? – MrD 2014-03-06 14:53:28

+0

這不是JSF特有的。 – BalusC 2014-03-06 15:11:39

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); 
}