Estou tentando desenvolver um Sistema e me deparei com o seguinte erro.
Ao clicar em Salvar no meu cadastro ele gera esse erro.
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: javax.servlet.ServletException: #{clienteHandler.salva}: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.saudetotal.modelo.Cliente.bairro
br.com.saudetotal.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:22)
root cause
javax.servlet.ServletException: #{clienteHandler.salva}: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.saudetotal.modelo.Cliente.bairro
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
br.com.saudetotal.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:19)
root cause
javax.faces.FacesException: #{clienteHandler.salva}: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.saudetotal.modelo.Cliente.bairro
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
br.com.saudetotal.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:19)
Isso independente de ter preenchido ou nao os campos.
Se eu acionar o voltar do browser e atualizar ele, e fizer novamente a inserção dos dados ele persiste normalmente.
Estou Usando Hibernate + Jsf + MySql.
djDufu
Agosto 1, 2008, 7:19am
#2
Bom dia, cara esse erro é por que o hibernate não conseguiu recuperar os valores da sessão, possivelmente por que não aconteceu o binding.
Mas de qualquer maneira, posta o código pra gente dar uma olhada. ok ???
abs,
Vlw pela ajuda.
Segue abaixo o codigo.
Classe Cliente
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:subview id="CadCliente">
<rich:tabPanel>
<rich:tab label="Cadastrar Cliente">
<h:form id="cadastro">
<rich:panel>
<f:facet name="panelcadcli">
Insira os Dados Pessoais do Cliente, campos marcados com * são obrigatorios.
</f:facet>
</rich:panel>
<rich:spacer height="8" />
<rich:panel>
<table>
<tr>
<td><h:outputText value="Nome Completo"/></td>
<td><h:inputText id="nome" value="#{clienteHandler.cliente.nome}" required="true">
<f:validateLength minimum="4"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="nome" style="color: darkred"/></td>
</tr>
<tr>
<td>Sexo:</td>
<td><h:selectOneRadio id="sexo" value="#{clienteHandler.cliente.sexo}" required="true" >
<f:selectItem itemLabel="Feminino" itemValue="F"/>
<f:selectItem itemLabel="Masculino" itemValue="M"/>
</h:selectOneRadio>
<h:message for="sexo" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Data de Nascimento"/></td>
<td><h:inputText id="dtaNascimento" value="#{clienteHandler.cliente.dataNascimento}" required="true" >
<f:convertDateTime pattern="ddMMyyyy"/>
</h:inputText>
<h:outputText value=" * DDMMAAAA"/>
<h:message for="dtaNascimento" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="CPF"/></td>
<td><h:inputText id="cpf" value="#{clienteHandler.cliente.cpf}">
<f:validateLength minimum="11"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="CPF" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="RG"/></td>
<td><h:inputText id="rg" value="#{clienteHandler.cliente.rg}"/>
<h:outputText value=" *"/>
<h:message for="RG" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Número Cartão SUS"/></td>
<td><h:inputText id="cartaoSUS" value="#{clienteHandler.cliente.cartaosus}">
<f:validateLength minimum="16"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="cartaoSUS" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Endereco"/></td>
<td><h:inputText id="endereco" value="#{clienteHandler.cliente.endereco}">
<f:validateLength minimum="10"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="endereco" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Bairro"/></td>
<td><h:inputText id="bairro" value="#{clienteHandler.cliente.bairro}">
<f:validateLength minimum="5"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="bairro" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Cidade"/></td>
<td><h:inputText id="cidade" value="#{clienteHandler.cliente.cidade}">
<f:validateLength minimum="5"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="cidade" style="color: darkred"/></td>
</tr>
<tr>
<td>UF:</td>
<td>
<jsp:include page="uf.jsp"/>
<h:outputText value=" *"/></td>
</tr>
<tr>
<td><h:outputText value="Mãe"/></td>
<td><h:inputText id="mae" value="#{clienteHandler.cliente.mae}">
<f:validateLength minimum="10"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="mae" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Pai"/></td>
<td><h:inputText id="pai" value="#{clienteHandler.cliente.pai}">
<f:validateLength minimum="10"/>
</h:inputText>
<h:outputText value=" *"/>
<h:message for="pai" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Telefone"/></td>
<td><h:inputText id="telefone" value="#{clienteHandler.cliente.telefone}"/>
<h:message for="telefone" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Data do Cadastro"/></td>
<td><h:inputText id="dtacadastro" readonly="true" value="#{clienteHandler.cliente.dataCadastro}">
<f:convertDateTime pattern="dd/MM/yyyy hh:mm"/>
</h:inputText>
<h:message for="dtacadastro" style="color: darkred"/></td>
</tr>
<tr>
<td><h:outputText value="Ativo"/></td>
<td><h:selectBooleanCheckbox id="CliAtivo" value="#{clienteHandler.cliente.ativo}" required="true"/>
</td>
</tr>
</table>
</rich:panel>
</h:form>
</rich:tab>
</rich:tabPanel>
<br/>
<h:panelGroup id="MostrabtnCadCliente">
<jsp:include page="btnCadCliente.jsp"/>
</h:panelGroup>
</f:subview>
Botoes da Classe Cliente
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:subview id="btnCadCliente">
<h:commandButton value="Pesquisar" action="#{clienteHandler.pesquisaCliente}"/>
<a4j:commandButton ajaxSingle="true" value="Limpar"
reRender="nome" status="commonstatus">
</a4j:commandButton>
<h:commandButton value="Fechar" action="#{ddmenu.mostrarConsultarCliente}" />
</f:subview>
Handler da Classe Cliente
package br.com.saudetotal;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.validator.ValidatorException;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import br.com.saudetotal.dao.Dao;
import br.com.saudetotal.modelo.Cliente;
import br.com.saudetotal.util.HibernateUtil;
public class ClienteHandler {
private Cliente cliente = new Cliente();
private List<Cliente> clientes = new ArrayList<Cliente>();
public Cliente getCliente() {
return cliente;
}
public List<Cliente> getClientes() {
System.out.println("Lendo Clientes...");
Session session = HibernateUtil.currentSession();
Dao<Cliente> dao = new Dao<Cliente>(session, Cliente.class);
return dao.list();
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public void salva() {
System.out.println("Adicionando: " + cliente.getNome());
Session session = HibernateUtil.currentSession();
Dao<Cliente> dao = new Dao<Cliente>(session, Cliente.class);
dao.merge(this.cliente);
this.cliente = new Cliente();
}
public void escolheCliente(ActionEvent event) {
UIComponent link = event.getComponent();
UIParameter param = (UIParameter) link.findComponent("editId");
Long id = (Long) param.getValue();
this.cliente = this.clientes.get(id.intValue() - 1);
}
public List<Cliente> pesquisaCliente() {
Session session = HibernateUtil.currentSession();
Criteria criteria = session.createCriteria(Cliente.class);
criteria.addOrder(Order.asc("nome_cli"));
return criteria.list();
}
public void validateCase(FacesContext context, UIComponent component, Object value) {
String valor = value.toString();
if (!valor.matches("[1-0]")) {
throw new ValidatorException(new FacesMessage("Inválido"));
}
}
public void Cancelar () {
this.cliente = new Cliente();
}
public void validaNome(FacesContext context, UIComponent component, Object value) {
String nome = value.toString();
if(!nome.matches("[A-Z.*}")) {
throw new ValidatorException(new FacesMessage("Nome Inválido"));
}
}
}
Hibernate Util
package br.com.saudetotal.util;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
private static Logger logger = Logger.getLogger(HibernateUtil.class);
private static SessionFactory sessionFactory;
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
static {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
public static Session openSession() {
if (sessions.get() != null) {
logger.error("Alguém não fechou uma janela aberta !!");
}
sessions.set(sessionFactory.openSession());
return sessions.get();
}
public static void closeCurrentSession() {
sessions.get().close();
sessions.set(null);
}
public static Session currentSession() {
return sessions.get();
}
public static void loggout() {
Session s = (Session) sessions.get();
s.setCacheMode(null);
}
}
[google]hibernate opensessioninview[/google]
peerless
Agradeço pela ajuda.
Só que estou iniciando em JAVA agora, e não consegui entender muita coisa.
Não quero que me passem a correção do código nem façam outro para mim, gostaria que me explica-se o que está acontecendo e a forma de corrigir.