2012-03-19 16 views
27

Uaktualniłem moją aplikację WWW Java EE, aby użyć nowszej wersji PrimeFaces i nagle nie zadziałało już wywołanie przeciążonej metody komponentu bean w atrybucie działania linii poleceń PrimeFaces. Próbowałem użyć domyślnego linku poleceń JSF, aby go przetestować i ten też nie działał.Czy EL obsługuje przeciążone metody?

podpisów metody są następujące:

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

Zawsze starał się rzucić do B.

bardziej ciekawy, jak może pracować przed aktualizacją?

Odpowiedz

32

EL nie obsługuje tego, nie. To zawsze będzie pierwsza metoda z tablicy Class#getMethods(), której nazwa (i ilość argumentów) pasuje do wywołania metody EL. To, czy zwraca tę samą metodę za każdym razem, czy nie, zależy od użytej wersji/wersji JVM. Być może w międzyczasie dokonałeś aktualizacji Java SE. Jawadok mówi nawet to:

Elementy zwróconej tablicy nie są sortowane i nie są w żadnej określonej kolejności.

Nie powinieneś polegać na nieokreślonym zachowaniu. Nadaj im inne imię.

+0

wielkie dzięki, twoje wyjaśnienie sprawia, że ​​teraz jest jasne – djmj

+1

Czy istnieje jakiś (techniczny) powód, dla którego to nie jest już obsługiwane w JSF 2? Jestem prawie pewien, że było to możliwe w wersjach JSF 1.x, prawda? – MrD

+0

To nie jest specyficzne JSF. – BalusC

5

Sposób, w jaki można to obejść, polega na stworzeniu ogólnej metody i wykonaniu "trasowania" wewnątrz tej metody. Wiem, że to może nie być idealne, ale kończy się mniej konfiguracji w funkcjach i stronach 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); 
}