EL поддерживает перегруженные методы? - PullRequest
28 голосов
/ 19 марта 2012

Я обновил свое веб-приложение Java EE, чтобы использовать более новую версию PrimeFaces, и внезапно вызов перегруженного метода bean-компонента в атрибуте действия из командной строки PrimeFaces больше не работал.Я попытался использовать командную ссылку JSF по умолчанию, чтобы проверить ее, и эта тоже не сработала.

Сигнатуры метода следующие:

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

Всегда пытался привести A к B.

Более любопытно, как это могло бы работать до обновления?

Ответы [ 2 ]

36 голосов
/ 26 апреля 2012

EL не поддерживает, нет.Это всегда будет первый метод массива Class#getMethods(), чье имя (и количество аргументов) соответствует вызову метода EL.Будет ли он возвращать один и тот же метод каждый раз или нет, зависит от используемой марки / версии JVM.Возможно, вы также сделали обновление Java SE.Javadoc даже говорит это:

Элементы в возвращаемом массиве не отсортированы и не в каком-либо определенном порядке.

Вы не должны полагаться на неопределенное поведение.Дайте им другое имя.

4 голосов
/ 19 сентября 2013

Способ обойти это - создать универсальный метод и выполнить «маршрутизацию» внутри этого метода.Я знаю, что это может быть не идеально, но в итоге у вас меньше настроек в функциях и страницах 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);
}
...