[RESOLVIDO] VRaptor com JQuery Validation erro ao submeter formulário

Tenho uma entidade com CRUD que funcionava perfeitamente.

Após implementar validação do formulário com Jquery validation a lista continua aparecendo, mas ao editar ou incluir e efetuar o submit obtenho a saída abaixo:

org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.status

Sei que ocorre porque o atributo no bean está setado como @Column(nullable=false), o que está correto, pois o dado é obrigatório.

Pesquisando no fórum, e na web, vi alguns colegas removendo o nullable.
Me parece que os parâmetros após o submit estão vindo vazios.

Alguém tem uma sugestão de como resolver mantendo a não aceitação para nulo?

Exite algum @Transient no campo que está vindo com erro?

Não Mickdark. O pior é que não percebo um ponto de partida…

Fabiaonoalima, pode colocar o código do mapeamento e a página com validation que vc implementou!!

remoção de post duplicado.

Deixei somente um atributo para simplificar ok?

package br.com.ericsson.etracking.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
public class Agenda {

    @Id   
    @GeneratedValue (strategy = GenerationType.AUTO)  
    private Long id;

    @Column(nullable=false, length=30)
    private String status;
	
	
	public void setId(Long id) {
		this.id = id;
	}
	
	
	public Long getId() {
		return id;
	}
	
	
        public String getStatus() {
		return status;
	}
	
	
	public void setStatus(String status) {
		this.status= status;
	}
}

O mapeamento do hibernate:

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Configurações para conexão com o db -->
        <property name="hibernate.connection.username">etracking</property>
        <property name="hibernate.connection.password">******</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/etracking</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="show_sql">false</property>
        <property name="format_sql">true</property>
        
        <!-- entidades -->
        <mapping class="br.com.ericsson.etracking.modelo.Agenda" />
    </session-factory>
</hibernate-configuration>

No head da página usei:

	<script src="http://code.jquery.com/jquery-latest.js"></script>
	<script type="text/javascript" src="http://jzaefferer.github.com/jquery-validation/jquery.validate.js"></script>
  <script type="text/javascript" src="<c:url value="/js/jquery_validation.js"/>"></script>

No “/js/jquery_validation.js”:

$(document).ready(function(){
    $("#form").validate({
        rules: {
            status: {required: true },
	    },
	    messages:{
		    status:{
			    required:  "  Informe o status Final",
			    minlength: "  Status deve conter, no minimo, 3 caracteres"
		    }
	    },
        submitHandler: function(form){
            if(confirm('Tem certeza?'))form.submit();
        }
    });
});

Bom!! Você pode tentar fazer 3 coisas:

Tenta tirar esse validation do gitHub ou escolhe apenas um deles para ficar:

Nesta linha

rules: { status: {required: true }, },

pode deixar assim

rules: { status: "required", },

E tenta tirar essa function handler para ver se funciona

,  
        submitHandler: function(form){  
            if(confirm('Tem certeza?'))form.submit();  
        }  

O log persiste.

Vou postar meu form abaixo.

      <form class="form" action="<c:url value="/agenda/${agenda.id}"/>" method="Post">
        <fieldset>
          <legend>EDITAR AGENDAMENTO</legend>
              <table border="0">
                <tr>
                   <td>
                      <label for="siteDestino">Site Destino</label>
                   </td>
                   <td>
                      <input class="field" id="siteDestino"  
                          type="text" size="60" name="siteDestino" value="${agenda.siteDestino}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="logradouro">Logradouro</label>
                   </td>
                   <td>
                      <input class="field" id="logradouro"  
                          type="text" size="60" name="logradouro" value="${agenda.logradouro}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="localidade">Localidade</label>
                   </td>
                   <td>
                      <input class="field" id="localidade"  
                          type="text" size="60" name="localidade" value="${agenda.localidade}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="uf">UF</label>
                   </td>
                   <td>
                      <input class="field" id="uf"  
                          type="text" size="60" name="uf" value="${agenda.uf}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="data">Data</label>
                   </td>
                   <td>
                      <input class="field" id="data"  
                          type="text" size="60" name="data" value="${agenda.data}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="hora">Hora</label>
                   </td>
                   <td>
                      <input class="field" id="hora"  
                          type="text" size="60" name="hora" value="${agenda.hora}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="rota">Rota</label>
                   </td>
                   <td>
                      <input class="field" id="rota"  
                          type="text" size="60" name="rota" value="${agenda.rota}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="contato">Contato</label>
                   </td>
                   <td>
                      <input class="field" id="contato"  
                          type="text" size="60" name="contato" value="${agenda.contato}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="telefone">Telefone</label>
                   </td>
                   <td>
                      <input class="field" id="telefone"  
                          type="text" size="60" name="telefone" value="${agenda.telefone}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="infra">Infra</label>
                   </td>
                   <td>
                      <input class="field" id="infra"  
                          type="text" size="60" name="infra" value="${agenda.infra}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="obs">Observação</label>
                   </td>
                   <td>
                      <input class="field" id="obs"  
                          type="text" size="60" name="obs" value="${agenda.obs}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="localSaida">Local Sainda</label>
                   </td>
                   <td>
                      <input class="field" id="localSaida"  
                          type="text" size="60" name="localSaida" value="${agenda.localSaida}"/>
                   </td>
                 </tr>
                 <tr>
                   <td>
                      <label for="status">Status</label>
                   </td>
                   <td>
                      <select class="field" id=status name="status" 
                          style="width: 400px">
                          <option value="" selected="selected">${agenda.status}</option>
                          <option value="Pendente">Pendente</option>
                          <option value="Agendado">Agendado</option>
                          <option value="Cross Docking">Cross Docking</option>
                          <option value="Devolvido a EDB">Devolvido a EDB</option>
                          <option value="Devolvido a WH SJC">Devolvido a WH SJC</option>
                          <option value="Em Transito/HUB">Em Transito/HUB</option>
                          <option value="Entregue">Entregue</option>
                          <option value="Reversa EDB Agendada">Reversa EDB Agendada</option>
                      </select>
                   </td>
                </tr>
                 <tr>
                   <td>
                      <label for="solicitante">Solicitante</label>
                   </td>
                   <td>
                      <input class="field" id="solicitante"  
                          type="text" size="60" name="solicitante" value="${agenda.solicitante}"/>
                   </td>
                </tr>
                <tr>
                   <td>
                   </td>
                   <td>
  					          <input type="hidden"  name="_method" value="put" />  
					               <input class="linkNew" type="submit"  value="SALVAR"/>  
                   </td>
                </tr>
              </table>
        </fieldset>      
      </form>

Rapaz, vc colocou uma classe no form e nao um id!!

Ao invés disso

$("#form").validate({  

Tenta isso

$(".form").validate({  

A validação funciona normal, e o submit também após remover o handler, mas quando efetua o submit…

org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.contato

Porém mudou o atributo reclamado, antes era
br.com.ericsson.etracking.modelo.Agenda.status

agora é
br.com.ericsson.etracking.modelo.Agenda.contato

você pode postar a classe mapeada completa!

É um bean. To pensando em remover as últimas implementações e se funcionar, reimplementar…
Mas aí a raíz do problema permanecerá oculta…

package br.com.ericsson.etracking.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
public class Agenda {

	@Id   
    @GeneratedValue (strategy = GenerationType.AUTO)  
    private Long id;
	@Column(name = "site_destino", nullable = false, length=20)
	private String siteDestino;	
	@Column(nullable = false, length=60)
	private String logradouro;
	@Column(nullable=false, length=60)
	private String localidade;
	@Column(nullable=false, length=2)
	private String uf;
	@Column(nullable=false, length=10)
	private String data;
	@Column(nullable=false, length=5)
	private String hora;
	@Column(nullable=false, length=2)
	private String rota;
	@Column(nullable=false, length=20)
	private String contato;
	@Column(nullable=false, length=14)
	private String telefone;	
	@Column(nullable=false, length=20)
	private String infra;
	@Column(nullable=false, length=60)
	private String obs;
	@Column(name = "local_saida", nullable = false, length=20)
	private String localSaida;	
	@Column(nullable=false, length=30)
	private String status;
	@Column(nullable=false, length=25)
	private String solicitante;
	
	
	public void setId(Long id) {
		this.id = id;
	}
	
	
	public Long getId() {
		return id;
	}
	
	
	public String getSiteDestino() {
		return siteDestino;
	}
	
	
	public void setSiteDestino(String siteDestino) {
		this.siteDestino = siteDestino;
	}
	
	
	public String getLogradouro() {
		return logradouro;
	}

	
	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}
	
	
	public String getLocalidade() {
		return localidade;
	}
	
	
	public void setLocalidade(String localidade) {
		this.localidade = localidade;
	}
	
	
	public String getUf() {
		return uf;
	}
	
	
	public void setUf(String uf) {
		this.uf = uf;
	}
	
	
	public String getData() {
		return data;
	}
	
	
	public void setData(String data) {
		this.data = data;
	}
	
	
	public String getHora() {
		return hora;
	}
	
	
	public void setHora(String hora) {
		this.hora = hora;
	}
	
	
	public String getRota() {
		return rota;
	}
	
	
	public void setRota(String rota) {
		this.rota = rota;
	}
	
	
	public String getContato() {
		return contato;
	}
	
	
	public void setContato(String contato) {
		this.contato = contato;
	}
	
	
	public String getTelefone() {
		return telefone;
	}
	
	
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	
	public String getInfra() {
		return infra;
	}
	
	
	public void setInfra(String infra) {
		this.infra = infra;
	}
	
	
	public String getObs() {
		return obs;
	}
	
	
	public void setObs(String obs) {
		this.obs = obs;
	}
	
	
	public String getLocalSaida() {
		return localSaida;
	}
	
	
	public void setLocalSaida(String localSaida) {
		this.localSaida = localSaida;
	}
	
	
	public String getStatus() {
		return status;
	}
	
	
	public void setStatus(String status) {
		this.status= status;
	}

	
	public String getSolicitante() {
		return solicitante;
	}
	
	
	public void setSolicitante(String solicitante) {
		this.solicitante = solicitante;
	}
}

Falta de ler a documentação!

o name do seus inputs tem que seguir a convenção do vraptor!

name=“agenda.status” e assim com todos eles!

Eu li, estava assim, removi a pouco para testar, vou mudar novamente, postarei o resultado.

Mickdark e kadu.m.lino,

Temos a seguinte conclusão:
Conforme kadu.m.lino mencionou o name dos inputs tem que seguir a convenção vraptor, (exemplo: name=“agenda.status”), caso contrário teremos a saída abaixo:

org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.siteDestino 

Estou utilizando JQuery Validation da seguinte forma em um arquivo .js
O problema é que preciso informar o seguinte para o Jquery que não aceita agenda.siteDestino devido o (.) ser um seletor:

$(document).ready(function(){
	$("#form").validate({
	  rules: {
		agenda.siteDestino:  {required: true, minlength: 2 },
	  },
	  messages:{
		  agenda.siteDestino:{
			  required:  "  Informe o site destino",
			  minlength: "  O site destino deve conter, no minimo, 2 caracteres"
		  }
	  }
	});
});

[color=red]A questão é que só é possível acrescentar a convenção do vraptor no validation do JQuery utilizando aspas (“agenda.siteDestino”) na rules devido o ponto.
[/color]
Solução:

$(document).ready(function(){
	$("#form").validate({
	  rules: {
		"agenda.siteDestino":  {required: true, minlength: 2 },
	  },
	  messages:{
		  "agenda.siteDestino":{
			  required:  "  Informe o site destino",
			  minlength: "  O site destino deve conter, no minimo, 2 caracteres"
		  }
	  }
	});
});

Não sei se está claro, então segue 2 links para esclarecer:

http://www.guj.com.br/java/202203-jquery--id-funciona-empresaid-nao-funciona
http://api.jquery.com/category/selectors

Mais uma vez o fórum ajudou muito. Grato pela atenção!