Поддерживает ли EL перегруженные методы?

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

Подписи метода следующие:

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

Он всегда пытался отличить от A до B.

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

Ответы

Ответ 1

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

Элементы возвращаемого массива не сортируются и не находятся в определенном порядке.

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

Ответ 2

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