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