VRaptor x Hibernate Validator - RESOLVIDO

18 respostas
J

tenho o seguinte todas entidade minha que tem campos por exemplo

@ManyToOne(fetch=FetchType.EAGER,cascade={CascadeType.MERGE,CascadeType.PERSIST})
  @JoinColumn(name="idtipooperacao",referencedColumnName="id")
  private CadTipoOperacao idtipooperacao;

o Hibernate nao valida nem voce colocando @NotNull nestes tipos de campos @ManyToOne trago os dados destes campos na tela em uma selectBox se usuario nao selecionar vai dar exception muito gigante entao o que fazer tem um jeito hibernate validar isso?

Obrigado !!!

18 Respostas

diogoprosoft

Cara eu faço assim para validação vê se ajuda…

Vraptor

@Validate(params={"pessoa"})
public void salvar(Pessoa pessoa)throws Exception{

E no Bean

@Column(name = "nm_pessoa", unique=true, length=50)
	@NotEmpty(message="O campo Nome é obrigatório")
	private String nmPessoa;
Lucas_Cavalcanti

@diogo
essa validação que vc falou é do vraptor2… o jvds está usando o VRaptor3…

@jvds
você está colocando na sua lógica que adiciona:

validator.addAll(Hibernate.validate(objeto));

??

tenta colocar o @NotNull e essa linha antes da parte de validação e vê se funciona…

G

Cabe lembrar bem que, como o Lucas já falou, você precisa invocar manualmente o validator caso você queria que o vraptor faça validação. Aliás você está usando o Hibernate Validator 3.x ou o Validator 4.x, que é baseado no Bean Validator?

Ainda ontem mandei um componente que escrevi que faz as validações para o Bean Validador / Hibernate Validator 4.x. Se você está usando essa versão terá de esperar um pouco.

Outra coisa que vale lembrar é que o hibernate chama automaticamente essas validações, assim você na verdade está delegando a validação ao Hibernate e não ao Vraptor, sendo assim o problema nem seria do Vraptor, mas sim do Hibernate.

J

Lucas Cavalcanti:
@diogo
essa validação que vc falou é do vraptor2… o jvds está usando o VRaptor3…

@jvds
você está colocando na sua lógica que adiciona:

validator.addAll(Hibernate.validate(objeto));

??

tenta colocar o @NotNull e essa linha antes da parte de validação e vê se funciona…

Ja coloquei @NotNull e nao funciona e ja tem antes de gravar o validator.addAll(Hibernate.validate(objeto)) o @NotNull so esta funcionando para campos do tipo primitivo ja quando e uma entidade nao.

J

garcia-jj:
Cabe lembrar bem que, como o Lucas já falou, você precisa invocar manualmente o validator caso você queria que o vraptor faça validação. Aliás você está usando o Hibernate Validator 3.x ou o Validator 4.x, que é baseado no Bean Validator?

Ainda ontem mandei um componente que escrevi que faz as validações para o Bean Validador / Hibernate Validator 4.x. Se você está usando essa versão terá de esperar um pouco.

Outra coisa que vale lembrar é que o hibernate chama automaticamente essas validações, assim você na verdade está delegando a validação ao Hibernate e não ao Vraptor, sendo assim o problema nem seria do Vraptor, mas sim do Hibernate.

Estou usando Hibernate Validator 3

Lucas_Cavalcanti

faz na mão então, coloque na sua entidade:

@AssertTrue
public boolean hasCadTipoOperacao() {
    return cadTipoOperacao != null
}

isso deveria funcionar

G

Não tem como funcionar apenas para primitivos e não para objeto. Você pode postar aqui a sua entidade, ou se ela for muito grande, postar a parte onde ela está anotada?

J
@Entity
@Table(name="EXP_ORDEM")
public class ExpOrdem {
	@Id
	@SequenceGenerator(name = "GENEXP_ORDEM", sequenceName = "GENEXP_ORDEM")  
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "GENEXP_ORDEM")	
	private Long id;
	@ManyToOne(fetch=FetchType.EAGER,cascade={CascadeType.MERGE,CascadeType.PERSIST},optional=false)
	@JoinColumn(name="idtipooperacao",referencedColumnName="id")
	private CadTipoOperacao idtipooperacao;
	@NotNull
	@Temporal(TemporalType.DATE)
	private Calendar datemissao;

	public ExpOrdem() {
		// TODO Auto-generated constructor stub
		setId(new Long(-1));
	}	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public CadTipoOperacao getIdtipooperacao() {
		return idtipooperacao;
	}
	public void setIdtipooperacao(CadTipoOperacao idtipooperacao) {
		this.idtipooperacao = idtipooperacao;
	}
	public Calendar getDatemissao() {
		return datemissao;
	}
	public void setDatemissao(Calendar datemissao) {
		this.datemissao = datemissao;
	}
}

segue ai minha entidade.

Lavieri

uma das possíveis causas

é vc estar usando o @NotNull de um pacote que não é o do Hiberante… se vc estivar importando o com.sun.istack.internal.NotNull então esse é o problema… o correto é

J

[quote=Lavieri]uma das possíveis causas

é vc estar usando o @NotNull de um pacote que não é o do Hiberante… se vc estivar importando o com.sun.istack.internal.NotNull então esse é o problema… o correto é

Eu estou importando do Hibernate mesmo cabei de verficar esta correto meu problema e o campo idtipooperacao.

Lucas_Cavalcanti

vc colocou @NotNull no idtipooperacao, ou vc estava só confiando no optional=false?

G

jvds, quais os campos que não estão funcionando a validação?

J

[quote=garcia-jj]jvds, quais os campos que não estão funcionando a validação?

isso mesmo campo primitivo blz ja para entidade nao nem forcando usando @NotNull

Lucas_Cavalcanti

possivelmente o hibernate ignore @NotNull em relacionamentos… vc tentou fazer o que tinha te falado?

@AssertTrue
public boolean hasCadTipoOperacao() {
   return idcadtipooperacao != null
}
G

O que eu ainda não consegui entender é se o @NotNull não funciona para objetos ou entidades. Você disse que funciona apenas para primitivos, então se você tiver um campo Date não funciona? Ou você quer dizer que não funciona apenas para entidades?

@NotNull @Temporal(TemporalType.TIMESTAMP) private Date creationDate;

Conforme a documentação do Bean Validator:

Eu tenho aqui em uma entidade Customer uma propriedade owner, e está funcionando a validação:

@NotNull @ManyToOne(fetch = FetchType.LAZY) private Branch owner;

Porém ela apenas valida se o campo owner é null ou não. Caso você queria que o validator faça também a validação do bean Branch é necessário usar o @Valid.

Procurei pela documentação do Hibernate Validator 3x mas não achei. :frowning: Meus comentários são baseados no 4x.

J

O que eu ainda não consegui entender é se o @NotNull não funciona para objetos ou entidades. Você disse que funciona apenas para primitivos, então se você tiver um campo Date não funciona? Ou você quer dizer que não funciona apenas para entidades?

@NotNull @Temporal(TemporalType.TIMESTAMP) private Date creationDate;

Conforme a documentação do Bean Validator:

Eu tenho aqui em uma entidade Customer uma propriedade owner, e está funcionando a validação:

@NotNull @ManyToOne(fetch = FetchType.LAZY) private Branch owner;

Porém ela apenas valida se o campo owner é null ou não. Caso você queria que o validator faça também a validação do bean Branch é necessário usar o @Valid.

Procurei pela documentação do Hibernate Validator 3x mas não achei. :frowning: Meus comentários são baseados no 4x.

Quero dizer que so funciona para Tipo Integer,String,Date so nao funciona quando e relacionamento @ManyToOne

Lavieri

Na 3.x também é so usar @Valid

J

RESOLVIDO

@Entity
@Table(name="EXP_ORDEM")
public class ExpOrdem {
	@Id
	@SequenceGenerator(name = "GENEXP_ORDEM", sequenceName = "GENEXP_ORDEM")  
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "GENEXP_ORDEM")	
	private Long id;
	//RESOLVIDO
	@Valid
	@NotNull
	@ManyToOne(fetch=FetchType.EAGER,cascade={CascadeType.MERGE,CascadeType.PERSIST})
	@JoinColumn(name="idtipooperacao",referencedColumnName="id")
	private CadTipoOperacao idtipooperacao;
	@NotNull
	@Temporal(TemporalType.DATE)
	private Calendar datemissao;

	public ExpOrdem() {
		// TODO Auto-generated constructor stub
		setId(new Long(-1));
	}	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public CadTipoOperacao getIdtipooperacao() {
		return idtipooperacao;
	}
	public void setIdtipooperacao(CadTipoOperacao idtipooperacao) {
		this.idtipooperacao = idtipooperacao;
	}
	public Calendar getDatemissao() {
		return datemissao;
	}
	public void setDatemissao(Calendar datemissao) {
		this.datemissao = datemissao;
	}
}

Obrigado a todas desta forma foi resolvido

Criado 19 de abril de 2010
Ultima resposta 20 de abr. de 2010
Respostas 18
Participantes 5