Поддерживает ли 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);
}