Olá pessoal,
Estou com esse problema, se adiciono o a4j:keepalive no jsf minhas operações de insert/update param de funcionar.
Já tentei várias coisas mas nao deu certo, segue meu codigo:
OBS: Se eu remover o a4j:keepAlive o problema nao corre!
JSF
<ui:composition template="/templates/principal.xhtml">
<head>
<meta http-equiv="content-Type" content="text/html; charset=utf-8"></meta>
</head>
<a4j:keepAlive beanName="contatoMB" />
<ui:define name="centro">
<a4j:loadScript id="js"
src="resource:///resources/jquery.maskedinput-1.2.2.js"
rendered="true" />
<f:subview id="subviewContato">
<rich:panel styleClass="panelPrincipal">
<f:facet name="header">
<h:outputText value="Cadastro || Contato" />
</f:facet>
<rich:tabPanel styleClass="tabPanel" switchType="client"
selectedTab="#{contatoMB.selectedTab}" id="tabPrincipal">
<rich:tab styleClass="background" label="Lista" id="tabPesquisa">
<h:form>
<rich:toolBar>
<h:outputLabel value="Pesquisa: " />
<h:selectOneMenu value="#{contatoMB.pesquisaSelectedField}">
<f:selectItems value="#{contatoMB.pesquisaFieldList}" />
</h:selectOneMenu>
<h:inputText value="#{contatoMB.pesquisaValue}"/>
<h:commandButton value="Localizar" />
</rich:toolBar>
<rich:dataTable id="contatoLista" rows="9" value="#{contatoMB.contatos}" var="contato" >
<f:facet name="header">
<rich:columnGroup>
<h:column>
<h:outputText styleClass="headerText" value="Código" />
</h:column>
<h:column>
<h:outputText styleClass="headerText" value="Apelido" />
</h:column>
<h:column>
<h:outputText styleClass="headerText" value="Fone" />
</h:column>
<h:column>
<h:outputText styleClass="headerText" value="CNPJ / CPF" />
</h:column>
<h:column>
<h:outputText styleClass="headerText" value="Ação" />
</h:column>
</rich:columnGroup>
</f:facet>
<rich:column width="30">
<h:outputText value="#{contato.id}" />
</rich:column>
<rich:column width="400">
<h:outputText value="#{contato.apelido}" />
</rich:column>
<rich:column width="150">
<h:outputText value="#{contato.fone1}" />
</rich:column>
<rich:column width="150">
<h:outputText value="#{contato.cnpj_cpf}" />
</rich:column>
<rich:column width="50" align="center">
<a4j:commandButton actionListener="#{contatoMB.update}"
title="Alterar #{contato.id}" reRender="tabPrincipal"
image="/imagens/ImagensUtilizadas/16x16/viewmag.png">
<f:param id="editId" value="#{contato.id}" name="y"/>
</a4j:commandButton>
<h:commandButton
image="/imagens/ImagensUtilizadas/16x16/remove.png"
onclick="return confirm('Deseja remover o registro: #{contato.apelido} ?');"
actionListener="#{contatoMB.delete}" id="btn">
<f:param id="deleteId" value="#{contato.id}" name="x"/>
</h:commandButton>
</rich:column>
<f:facet name="footer">
<rich:datascroller align="left" for="contatoLista" id="ds1" />
</f:facet>
</rich:dataTable>
</h:form>
</rich:tab>
<rich:tab id="tabDados" label="Dados">
<h:form>
<rich:panelBar height="300" style="border-style:none;">
<rich:panelBarItem label="">
<h:inputHidden value="#{contatoMB.contato.id}" />
<h:inputHidden value="#{contatoMB.contato.insert_usuario}" />
<h:panelGrid columns="4">
<h:outputText value="Nome" styleClass="campoObrigatorio" />
<h:inputText value="#{contatoMB.contato.nome}" size="40" />
<h:outputText value="Tipo" styleClass="campoObrigatorio" />
<h:column>
<h:selectOneMenu id="somPessoa"
value="#{contatoMB.contato.tipo_pessoa}">
<f:selectItems value="#{contatoMB.tipoPessoa}" />
</h:selectOneMenu>
<rich:message for="somPessoa"></rich:message>
</h:column>
<h:outputText value="Apelido" />
<h:column>
<h:inputText value="#{contatoMB.contato.apelido}" size="30" />
<h:graphicImage id="giApelido" styleClass="tooltip-text"
value="/imagens/ImagensUtilizadas/16x16/preferences_desktop_notification.png">
<rich:toolTip>
<span> Informe o nome resumido!<br />
Ex: Caso o nome seja Petrobras Petróleo Brasileiro S.A. O
Apelido pode ser Petrobras. </span>
</rich:toolTip>
</h:graphicImage>
</h:column>
<h:outputText value="Endereço" />
<h:inputText value="#{contatoMB.contato.endereco}" size="30"
maxlength="60" />
<h:outputText value="Número" />
<h:inputText value="#{contatoMB.contato.numero}" size="10"
maxlength="10" />
<h:outputText value="CEP" />
<h:inputText value="#{contatoMB.contato.cep}" id="intCep">
<rich:jQuery selector="#intCep" query="mask('99999999')"
timing="onload" />
</h:inputText>
<h:outputText value="Bairro" />
<h:inputText value="#{contatoMB.contato.bairro}" size="30"
maxlength="30" />
<h:outputText value="Cidade" />
<h:inputText value="#{contatoMB.contato.cidade}" size="30"
maxlength="60" />
<h:outputText value="Estado" />
<h:selectOneMenu value="#{contatoMB.contato.uf_sigla}">
<f:selectItems value="#{ufMB.combo}" />
</h:selectOneMenu>
<h:outputText value="Complemento" />
<h:inputText value="#{contatoMB.contato.complemento}"
size="30" maxlength="60" />
<h:outputText value="Pais" />
<h:panelGrid columns="3" cellpadding="0" cellspacing="0">
<a4j:outputPanel layout="block">
<h:inputText size="1" id="Pais"
value="#{contatoMB.contato.pais_sigla3}" />
</a4j:outputPanel>
<rich:suggestionbox height="100" width="250"
id="suggestionBoxPais" for="Pais" tokens=",[]"
suggestionAction="#{contatoMB.autocompletePais}" var="pais"
fetchValue="#{pais.sigla3}">
<h:column>
<h:outputText value="#{pais.nome}" />
</h:column>
<a4j:support event="onselect" reRender="ottPais">
<f:setPropertyActionListener value="#{pais.nome}"
target="#{contatoMB.paisSelecionado}" />
</a4j:support>
</rich:suggestionbox>
<h:outputText id="ottPais"
value="#{contatoMB.paisSelecionado} #{contatoMB.contato.pais.nome}"
styleClass="Lookup" />
</h:panelGrid>
<h:outputText value="Fone1" />
<h:inputText value="#{contatoMB.contato.fone1}" maxlength="20" />
<h:outputText value="Fone2" />
<h:inputText value="#{contatoMB.contato.fone2}" maxlength="20" />
<h:outputText value="Celular" />
<h:inputText value="#{contatoMB.contato.celular}"
maxlength="20" />
<h:outputText value="Fax" />
<h:inputText value="#{contatoMB.contato.fax}" maxlength="20" />
<h:outputText value="Nextel" />
<h:inputText value="#{contatoMB.contato.nextel}"
maxlength="20" />
<h:outputText value="E-mail" />
<h:inputText value="#{contatoMB.contato.email}" size="30" />
<h:outputText value="Insc. Estadual" />
<h:inputText value="#{contatoMB.contato.inscricaoestadual}"
maxlength="12" />
<h:outputText value="CPNJ/CPF" />
<h:inputText value="#{contatoMB.contato.cnpj_cpf}"
id="intCNPJ">
<rich:jQuery selector="#intCNPJ"
query="mask('99999999999999')" timing="onload" />
</h:inputText>
<h:outputText value="Cargo" />
<h:inputText value="#{contatoMB.contato.cargo}" size="30"
maxlength="30" />
<h:outputText value="WebSite" />
<h:inputText value="#{contatoMB.contato.website}" size="30"
maxlength="60" />
<h:outputText value="Matriz" />
<h:panelGrid columns="3" cellpadding="0" cellspacing="0">
<a4j:outputPanel layout="block">
<h:inputText size="1" id="Matriz"
value="#{contatoMB.contato.agenda_id}" />
</a4j:outputPanel>
<rich:suggestionbox height="100" width="250"
id="suggestionBoxMatriz" for="Matriz" tokens=",[]"
suggestionAction="#{contatoMB.autocompleteMatriz}" var="contato"
fetchValue="#{contato.id}">
<h:column>
<h:outputText value="#{contato.apelido} - " />
<h:outputText value="#{contato.cnpj_cpf}" />
</h:column>
<a4j:support event="onselect" reRender="ottMatriz">
<f:setPropertyActionListener value="#{contato.apelido}"
target="#{contatoMB.matrizSelecionada}" />
</a4j:support>
</rich:suggestionbox>
<h:outputText id="ottMatriz"
value="#{contatoMB.matrizSelecionada} #{contatoMB.contato.matriz.apelido}"
styleClass="Lookup" />
</h:panelGrid>
<h:outputText value="Observações" />
<h:inputTextarea value="#{contatoMB.contato.observacoes}"
cols="47" rows="4" maxlength="200" />
<h:outputText value="" />
<h:outputText value="" />
<h:selectBooleanCheckbox title="Importador" label="Importador"
value="#{contatoMB.contato.grupo_importador}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Importador" />
<h:selectBooleanCheckbox label="Exportador"
value="#{contatoMB.contato.grupo_exportador}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Exportador" />
<h:selectBooleanCheckbox label="Agente de Carga"
value="#{contatoMB.contato.grupo_agentecarga}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Agente de Carga" />
<h:selectBooleanCheckbox label="Transportadora"
value="#{contatoMB.contato.grupo_transportador_nacional}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Transportadora" />
<h:selectBooleanCheckbox label="Despachante"
value="#{contatoMB.contato.grupo_despachante}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Despachante" />
<h:selectBooleanCheckbox label="Transportador Internacional"
value="#{contatoMB.contato.grupo_transportador_int}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Transportador" />
<h:selectBooleanCheckbox label="Armador"
value="#{contatoMB.contato.grupo_armador}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Armador" />
<h:selectBooleanCheckbox label="Agência Marítima"
value="#{contatoMB.contato.grupo_agenciamaritima}"
converter="javax.faces.Boolean">
</h:selectBooleanCheckbox>
<h:outputText value="Agência Marítima" />
</h:panelGrid>
<h:commandButton actionListener="#{contatoMB.insert}"
value="Novo" />
<a4j:commandButton actionListener="#{contatoMB.save}" reRender="contatoLista"
value="Salvar" />
</rich:panelBarItem>
</rich:panelBar>
</h:form>
</rich:tab>
</rich:tabPanel>
</rich:panel>
</f:subview>
</ui:define>
</ui:composition>
Meu DAO
@SuppressWarnings("serial")
public class Dao<T> implements Serializable{
private Class<T> persistentClass;
private Session session;
public Dao(Session session, Class<T> persistentClass){
this.session = session;
this.persistentClass = persistentClass;
}
public void saveOrUpdate(T t){
session.saveOrUpdate(t);
session.flush();
}
public void delete(T t){
session.delete(t);
}
public void save(T t){
session.save(t);
}
public void update(T t){
session.update(t);
}
@SuppressWarnings("unchecked")
public T load(Integer id){
return (T) session.load(persistentClass, id);
}
@SuppressWarnings("unchecked")
public List<T>findAll(String fieldOrder, Boolean orderDesc){
Criteria c = this.session.createCriteria(persistentClass);
if(orderDesc == false){
c.addOrder(Order.asc(fieldOrder));
}else{
c.addOrder(Order.desc(fieldOrder));
}
return c.list();
}
@SuppressWarnings("unchecked")
public List<T> findByName(String fieldName, String fieldValue,String fieldOrder, Integer maxResults){
Criteria c = this.session.createCriteria(persistentClass);
c.add(Restrictions.ilike(fieldName, fieldValue,MatchMode.ANYWHERE));
c.addOrder(Order.asc(fieldOrder));
if(maxResults == null){
c.setMaxResults(99999);
}else{
c.setMaxResults(maxResults);
}
return c.list();
}
@SuppressWarnings("unchecked")
public List<T> findByName(String fieldName, String fieldValue,String fieldOrder, Integer maxResults,MatchMode matchMode){
Criteria c = this.session.createCriteria(persistentClass);
c.add(Restrictions.ilike(fieldName, fieldValue,matchMode));
c.addOrder(Order.asc(fieldOrder));
if(maxResults == null){
c.setMaxResults(99999);
}else{
c.setMaxResults(maxResults);
}
return c.list();
}
@SuppressWarnings("unchecked")
public List<T> findByName(String fieldName, String fieldValue,String fieldOrder,Integer maxResults,MatchMode matchMode, Boolean orderAsc){
Criteria c = this.session.createCriteria(persistentClass);
c.add(Restrictions.ilike(fieldName, fieldValue,matchMode));
if(orderAsc == true){
c.addOrder(Order.asc(fieldOrder));
}else{
c.addOrder(Order.desc(fieldOrder));
}
if(maxResults == null){
c.setMaxResults(99999);
}else{
c.setMaxResults(maxResults);
}
return c.list();
}
}
Managed Bean
@SuppressWarnings( { "serial" })
public class ContatoMB extends SuperMB implements Serializable{
private Contato contato = new Contato();
private Dao<Contato> dao;
private Dao<Pais> daoPais;
private ArrayList<SelectItem> tipoPessoa = new ArrayList<SelectItem>();
private String matrizSelecionada;
private String paisSelecionado;
public void setSessao(Session session) {
this.dao = new Dao<Contato>(session, Contato.class);
this.daoPais = new Dao<Pais>(session, Pais.class);
}
public ContatoMB() {
pesquisaSelectedField = "nome";
pesquisaFieldList.add(new SelectItem("nome", "Nome"));
pesquisaFieldList.add(new SelectItem("apelido", "Apelido"));
pesquisaFieldList.add(new SelectItem("cnpj_cpf", "CNPJ / CPF"));
tipoPessoa.add(new SelectItem("", "Selecione"));
tipoPessoa.add(new SelectItem("J", "Júridica"));
tipoPessoa.add(new SelectItem("F", "Física"));
}
public List<Contato> getContatos() {
return dao.findByName("nome", pesquisaValue, "nome", 20,
MatchMode.START);
}
public ArrayList<Contato> autocompleteMatriz(Object suggest) {
dao.findByName("nome", (String) suggest, "nome", 30, MatchMode.START);
}
public ArrayList<Pais> autocompletePais(Object suggest) {
Session s = HibernateUtil.openSession();
ArrayList<Pais> listSelectItem = new ArrayList<Pais>();
try {
daoPais = new Dao<Pais>(s,Pais.class);
listSelectItem = (ArrayList<Pais>) daoPais.findByName("nome",
(String) suggest, "nome", 10, MatchMode.START);
} catch (Exception e) {
e.printStackTrace();
}finally{
s.close();
}
return listSelectItem;
}
@Override
public void insert(ActionEvent event) {
contato = new Contato();
contato.setId(-1);
selectedTab = "tabDados";
}
public void save(ActionEvent event) {
dao.saveOrUpdate(contato);
}
public void pesquisa(ActionEvent event){
selectedTab = "tabPesquisa";
}
@Override
public void update(ActionEvent event) {
Integer id = (Integer) MyUtil.MyActionEvent(event, "editId");
contato = (Contato) dao.load(id);
selectedTab = "tabDados";
desativarBotaoSalvar = false;
desativarBotaoNovo = false;
}
@Override
public void delete(ActionEvent event) {
Contato contato = dao.load((Integer) MyUtil.MyActionEvent(event,
"deleteId"));
try {
dao.delete(contato);
} catch (Exception e) {
new GeraFacesMessage("Erro");
}
}
public Contato getContato() {
return contato;
}
public void setContato(Contato contato) {
this.contato = contato;
}
public ArrayList<SelectItem> getTipoPessoa() {
return tipoPessoa;
}
public void setTipoPessoa(ArrayList<SelectItem> tipoPessoa) {
this.tipoPessoa = tipoPessoa;
}
public String getMatrizSelecionada() {
return matrizSelecionada;
}
public void setMatrizSelecionada(String matrizSelecionada) {
this.matrizSelecionada = matrizSelecionada;
}
public String getPaisSelecionado() {
return paisSelecionado;
}
public void setPaisSelecionado(String paisSelecionado) {
this.paisSelecionado = paisSelecionado;
}
public Dao<Contato> getDao() {
return dao;
}
public void setDao(Dao<Contato> dao) {
this.dao = dao;
}
public Dao<Pais> getDaoPais() {
return daoPais;
}
public void setDaoPais(Dao<Pais> daoPais) {
this.daoPais = daoPais;
}
}
Filter
public class HibernateSessionfilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fc) throws IOException, ServletException {
Session session = HibernateUtil.openSession();
try{
session.beginTransaction();
((HttpServletRequest)req).setAttribute("sessao", session);
fc.doFilter(req, res);
session.beginTransaction().commit();
}catch (Exception e) {
throw new ServletException(e);
}finally{
session.close();
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
Faces config, onde é injetado a session no MB
<managed-bean>
<managed-bean-name>contatoMB</managed-bean-name>
<managed-bean-class>controle.cadastro.ContatoMB</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>sessao</property-name>
<value>#{requestScope.sessao}</value>
</managed-property>
</managed-bean>