VRaptor3 - Problema com Hibernate Validator

Pessoal,

Estou tendo um problema quando tento validar um objeto com o hibernate validator. A data funciona sem problemas, mas o Orgão não funciona e nem dá erro.

Quando eu tento o @NotEmpty(import org.hibernate.validator.constraints.NotEmpty), a validação funciona perfeitamente para campos String, mas dá erro no campo Orgão(br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.validation.UnexpectedTypeException: No validator could be found for type: app.models.Orgao)

Entidade

package app.models;

import java.util.Date;
import java.util.List;
import javax.persistence.JoinColumn;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

@javax.persistence.Entity
public class Concurso extends Entity {
	
	@NotNull
	@Temporal(TemporalType.DATE)
	private Date data;
	
	@ManyToOne
	@NotNull
	private Orgao orgao;

         ...

}

ivy.xml

<ivy-module version="2.0">
	<info organisation="rank" module="rank" />

	<configurations>
		<conf name="default" description="dependencies used for compile" />
		<conf name="provided" description="dependencies used for compile but is not packaged" visibility="public" />
		<conf name="test" description="dependencies used for tests" visibility="public" />
		<conf name="jetty" description="dependencies used for jetty" visibility="public" />
		<conf name="minify" description="dependencies used to minify js and css" visibility="public" />
	</configurations>

	<dependencies>
		<dependency org="br.com.caelum" name="vraptor" rev="3.4.0" conf="default" />
		
		<!--	<dependency org="org.hsqldb" name="hsqldb" rev="2.2.4" conf="default" />      -->

		<dependency org="postgresql" name="postgresql" rev="9.1-901.jdbc4" conf="default" />
		
		<dependency org="opensymphony" name="sitemesh" rev="2.4.2" conf="default" />
		<dependency org="javax.servlet" name="jstl" rev="1.2" conf="default" />
		<dependency org="org.hibernate" name="hibernate-entitymanager" rev="3.6.7.Final" conf="default" />
		<dependency org="org.hibernate" name="hibernate-c3p0" rev="3.6.7.Final" conf="default" />
		<dependency org="org.hibernate" name="hibernate-validator" rev="4.2.0.Final" conf="default" />
		<dependency org="joda-time" name="joda-time" rev="2.0" conf="default" />
		<dependency org="com.thoughtworks.xstream" name="xstream" rev="1.4.1" conf="default" />

		<!-- Provided dependencies -->
		<dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="provided->default" />
		<dependency org="javax.servlet.jsp" name="jsp-api" rev="2.1" conf="provided->default" />

		<!-- Test dependencies -->
		<dependency org="junit" name="junit" rev="4.10" conf="test->default" />
		<dependency org="org.hamcrest" name="hamcrest-all" rev="1.1" conf="test->default" />
		<dependency org="org.mockito" name="mockito-all" rev="1.8.5" conf="test->default" />

		<!-- Jetty dependencies -->
		<dependency org="org.mortbay.jetty" name="jsp-api-2.1" rev="6.1.14" conf="jetty->default" />
		<dependency org="org.mortbay.jetty" name="jsp-2.1" rev="6.1.14" conf="jetty->default" />
		<dependency org="org.mortbay.jetty" name="jetty-ant" rev="6.1.14" conf="jetty->default" />

		<!-- Minify dependencies -->
		<dependency org="com.yahoo.platform.yui" name="yuicompressor" rev="2.3.6" conf="minify->default" />
	</dependencies>
</ivy-module>

Controller

       @Post("/concursos")
	public void create(Concurso concurso) {
		validator.validate(concurso);
		
		if (validator.hasErrors())
			incluirListas();

		validator.onErrorUsePageOf(this).newConcurso();
		
		concursoRepository.create(concurso);
		result.redirectTo(this).index();
		
	}

Alguem poderia me ajudar?

tenta fazer isso:

   @Valid
   @ManyToOne  
    @NotNull  
    private Orgao orgao;  
  

Lucas,

Agora eu não consigo gravar.  Está aparecendo a seguinte mensagem na validação: orgao.nome - não pode ser nulo

Ele está tendando validar a entidade Orgao.

Segue abaixo a combo:

<div class="field">Orgao:<br />

		<select id="orgao" name="concurso.orgao.id">  
		    <option></option>
            <c:forEach var="selectOrgao" items="${orgaoList}">  
                <option value="${selectOrgao.id}"  
                <c:if test="${selectOrgao.id == concurso.orgao.id}">selected="true"</c:if>>  
                    ${selectOrgao.nome}</option>  
            </c:forEach>  
        </select> 
	</div>
       
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;

@javax.persistence.Entity
public class Orgao extends Entity {
	
	@NotNull
	@Length(min = 3, max = 50)
	private String nome;

ok, tire o @Valid, e deixe o orgao como @NotNull, e não @NotEmpty@NotEmpty é só pra strings (e listas talvez)

Agora dá um erro de objeto transiente. Só que o @NotNull deveria justamente impedir a submissão do form com o Orgão não preenchido.

[jetty] Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: app.models.Concurso.orgao -> app.models.Orgao

o problema é que ele cria o orgão, com o id nulo, por que vc colocou o parâmetro concurso.orgao.id na requisição (mesmo que ele esteja em branco).

Tudo bem, mas como deveria ser setada a combo para resolver esse problema? Pois não funciona se eu tentar setar direto o objeto (concurso.orgao). Tem alguma outra forma de fazer isso?

até tem…

você pode colocar no controller:

if (concurso.getOrgao().getId() == null)
    concurso.setOrgao(null);

se eu não me engano você pode trocar o projeto que instancia esses parâmetros. No web.xml:

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>
       br.com.caelum.vraptor.http.iogi,
        ...outros pacotes...
    </param-value>
</context-param>

e baixar o jar
http://repo1.maven.org/maven2/br/com/caelum/iogi/0.9.0/iogi-0.9.0.jar

Lucas,

A primeira solução funcionou bem. Depois vou ver se tento a outra e posto aqui.

Obrigado pela ajuda.