2012-03-19 6 views
27

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

метод сигнатур заключаются в следующем:

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

Он всегда старался отбрасывать от А до В.

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

ответ

32

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

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

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

+0

большое спасибо, ваше объяснение делает вещи теперь ясно – djmj

+1

Есть ли (технический) причина, почему это не поддерживается в JSF 2 больше? Я уверен, что это было возможно в версиях JSF 1.x, не так ли? – MrD

+0

Это не спецификация JSF. – BalusC

5

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