Pessoal qual o efeito colateral quando implemento a interface PhaseListener e sobrescrevo o site método desta forma:
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
O que aconteceu comigo foi que parou de funcionar:
<f:ajax render="instrutor" event="change" listener="#{turmaBean.alterarComboBoxEstado}"/>
Quando adicionei o atributo immediate=true consegui desparar o evento porém, ele não submete o valor correto da combo.
Segue abaixo a minha implementação que encontrei num blog:
package sigpr.web.view.filter;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.ServletContext;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class HibernateRestoreViewPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.MANUAL);
return session;
}
protected SessionFactory lookupSessionFactory() {
FacesContext context = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);
return (SessionFactory) wac.getBean("sessionFactory", SessionFactory.class);
}
@Override
public void afterPhase(PhaseEvent event) {
}
@Override
public void beforePhase(PhaseEvent event) {
SessionFactory sessionFactory = lookupSessionFactory();
if (!TransactionSynchronizationManager.hasResource(sessionFactory)) {
Session session = getSession(sessionFactory);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}