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

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

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

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

Он всегда пытался привести А к Б.

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

2 ответа

Решение

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

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

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

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