romenig
Fevereiro 20, 2013, 3:25pm
#1
Olá caros colegas,
estou fazendo a apostila fj28 do VRaptor e me encontrei com um erro. Eu estou fazendo o exercicio de validaçao do atraves do hibernate. Eu fiz conforme a apostila todos os passos.
minha classe Produto:
[code]
package br.com.caelum.goodbuy.modelo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.validator.Length;
import org.hibernate.validator.Min;
import org.hibernate.validator.NotNull;
@Entity
public class Produto {
@Id
@GeneratedValue
private Long id;
@NotNull
@Length(min = 3)
private String nome;
@NotNull
@Length(max = 40)
private String descricao;
@Min(0)
private Double preco;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Double getPreco() {
return preco;
}
public void setPreco(Double preco) {
this.preco = preco;
}
}[/code]
Metodo adiciona do ProdutosController:
//adiciona utiliza o validator do Hibernate
public void adiciona(final Produto produto) {
validator.validate(produto);
validator.onErrorUsePageOf(ProdutosController.class).formulario();
dao.salva(produto);
result.redirectTo(this).lista();
}
meu erro foi esse:
Estado HTTP 500 - exception raised, check root cause for details: org.hibernate.validator.InvalidStateException: validation failed for: br.com.caelum.goodbuy.modelo.Produto
type Informe de Excepción
mensaje exception raised, check root cause for details: org.hibernate.validator.InvalidStateException: validation failed for: br.com.caelum.goodbuy.modelo.Produto
descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.
excepción
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.validator.InvalidStateException: validation failed for: br.com.caelum.goodbuy.modelo.Produto
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
causa raíz
org.hibernate.validator.InvalidStateException: validation failed for: br.com.caelum.goodbuy.modelo.Produto
org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:148)
org.hibernate.validator.event.ValidateEventListener.onPreInsert(ValidateEventListener.java:172)
org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:160)
org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
br.com.caelum.goodbuy.dao.ProdutoDAO.salva(ProdutoDAO.java:23)
br.com.caelum.goodbuy.controller.ProdutosController.adiciona(ProdutosController.java:33)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/6.0.36.
Apache Tomcat/6.0.36
abaixo eu posto a foto dos meus jars, antes dava erro por q nao tinha os jars do validator, eu antes coloquei todos que vi que faltavam atraves da pasta do Vraptor>Optional>hibernate e somente depois que li vi que era necessario somente um arquivo(hibernate-validator-X.X.X.jar ) mas acho que não tem problema nenhum colocar os outros, coloquei para evitar passar por isto novamente.
vc ta com jar repetidos com versão diferente tenta tirar as repetições e testa novamente
por ex:
hibernate-validator-3.1.ga.jar
hibernate-validator-4.0.2.ga.jar
tire um dos dois
commons-collections-3.1.jar
commons-collections-3.1.2.jar
hibernate3.jar
hibernate-3.6.1.jar
log4j-1.2.16.jar
log4j-1.2.17.jar
caso isso não de certo
delete todos os jar da pasta lib e depois adicione novamente seguindo a sequencia
jars:
pasta
1º mandatory
2º containers/spring ou um dos outros. não pode ser todos escolha um
3º optional/hibernate
4º o jar do vraptor
rode e teste novamente a aplicação
não pode haver jars repetidos na pasta lib
romenig
Fevereiro 21, 2013, 4:15pm
#4
foi isso mesmo, a solução foi apagar todos e recolocar os jars necessarios, muito obrigado DaniloAndrade e espinheira!
Achei muito interessante a maneira de validar com Hibernate, mas tive uma dúvida, no caso do preço eu quis postar uma mensagem como todos os outros para que posteriormente utilizar internacionalizaçao. Eu deixei assim a variavel preco:
@NotNull(message="{preco.vazio}")
@Min(value=0, message="{preco.negativo}")
private Double preco;
na apostila estava assim:
@Min(0)
private Double preco;
O correto seria validar e mostrar o erro quando colocasse numeros negativos e me funciona, sendo que tive um exemplo que coloquei o valor 0 e ele não validou e registrou no banco o valor 0 que não estaria correto em colocar um valor 0, daí como faria para que não colocasse um valor 0 e tampouco negaivo no banco?
tentei colocar (0.1, 0,1) como minimo e nao funciona!
Segundo a documentação dessas anotações (@Min , @Max e outras), a validação não funciona para doubles ou floats. O motivo pode ser encontrado aqui: http://stackoverflow.com/questions/7422803/why-do-bean-validation-min-max-constraints-not-support-the-double-type .