Ответ 1
Событие preRenderView
запускается только при каждом запросе перед визуализацией представления. Запрос ajax также является запросом, который отображает представление. Таким образом, поведение полностью ожидается.
У вас есть в основном 2 варианта:
-
Замените его методом
@PostConstruct
на@ViewScoped
bean.@ManagedBean @ViewScoped public class ManagedBean { @PostConstruct public void onLoad() { // ... } }
Это происходит тогда, когда bean создается впервые. Экземпляр bean, охваченный представлением, живет до тех пор, пока вы взаимодействуете с одним и тем же представлением через postbacks, ajax или нет.
-
Выполните проверку внутри метода слушателя, если текущий запрос является ajax-запросом.
@ManagedBean // Any scope. public class ManagedBean { public void onLoad() { if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { return; // Skip ajax requests. } // ... } }
Или, если вы действительно заинтересованы в пропуске postbacks вместо особых запросов ajax, тогда сделайте это вместо:
if (FacesContext.getCurrentInstance().isPostback()) { return; // Skip postback requests. }