[RESOLVIDO] VRaptor não está injetando valor da view na entidade do Controller

12 respostas
R

Quais são as classes do VRaptor que fazem a busca dos parametros setters e getters para preencher os parametros da entity do Controller vindo da view?
Tenho como fazer um debugger nisso?

Tenho uma classe de turma e no formulário um checkbox para selecionar este registro. No entanto, quando faço o POST do formulário, o setter da entity não é chamado.
Permanecendo o valor padrão do campo.

Fiz alguns testes:

public class Turma
{
	@Column(columnDefinition="bool default true")
	private Boolean situacao = true;

	public boolean getSituacao()
	{
		System.out.println("Getting Situação => " + situacao);
		return situacao;
	}

	public void setSituacao(Boolean situacao)
	{
		System.out.println("Setting Situação => " + situacao);
		this.situacao = situacao;
	}	
}
public class TurmaController
{
	public void update( Turma entity ) 
	{
		System.out.println("Situação no Controller => " + entity.getSituacao());
		super.update( entity );
	}
}

formulario.jsp

<input type="checkbox" name="entity.situacao" <c:if test="${entity.situacao}"> checked="checked" </c:if> />

========= RESULTADO SE DEIXO O CAMPO DESMARCADO NA INTERFACE
Getting Situação => true
Getting Situação => true
Situação no Controller => true
Getting Situação => true

======== RESULTADO SE DEIXO O CAMPO MARCADO NA INTERFACE
Setting Situação => true
Getting Situação => true
Situação no Controller => true
Getting Situação => true

O VRaptor não está conseguindo injetar o campo na minha entity. Ele não está passando pelo Setter... e pega o valor padrão do campo no objeto que é true.

Se eu passo o valor booleano fora da entity e faço o setter manualmente, funciona.

public class TurmaController
{
	public void update( boolean situacao, Turma entity ) 
	{
		entity.setSituacao(situacao);
		System.out.println("Situação no Controller => " + entity.getSituacao());
		super.update( entity );
	}
}

Como posso resolver isso?

12 Respostas

J

Da uma olhada se vc nao esta inicializando este campo na entidade no construtor tipo.

Lucas_Cavalcanti

tenta trocar a situacao de Boolean pra boolean e ver se vai.

R

Não mudo estes parâmetros no construtor.

Será que tem algum problema o campo estar inicializado na entidade?

R

Colocando o boolean para primitivo não funcionou. No entanto, mudando a entidade para:

Lucas_Cavalcanti

ah, entendi qual é o problema…

quando vc usa um checkbox, ele vai pra requisição só se estiver checado.

ou seja, quando ele não está checkado não vai o parâmetro pra requisição e consequentemente o vraptor não chama o setter. Por isso que não funciona se o parâmetro já vier como true.

R

Lucas,

Notei um comportamento estranho.

Se deixo a propriedade com o valor padrão false.

Ele preenche o valor da interface corretamente. Se está selecionado o checkbox ele chega como true, se não está chega como false.

Se deixo a propriedade com o valor padrão true.

Ele preenche a entity sempre com o valor true.

Lucas_Cavalcanti

veja minha mensagem anterior :wink:

R

Lucas Cavalcanti:
ah, entendi qual é o problema…

quando vc usa um checkbox, ele vai pra requisição só se estiver checado.

ou seja, quando ele não está checkado não vai o parâmetro pra requisição e consequentemente o vraptor não chama o setter. Por isso que não funciona se o parâmetro já vier como true.

Entendi… então quando eu passo só o valor booleano no parametro do Controller e ele não está marcado, chegará o valor false que o valor padrão do boolean.
Se não, chegará true. Por isso, quando faço o setter manualmente ele funciona.

Porém, quando uso com o VRaptor não chamará o setter e usuará o valor padrão que no meu caso é o true. Então, em qualquer uma das situações ele ficará true.

Tenho como criar um converter ou um interceptador para continuar deixando a variável com o valor padrão de true? Ou teria que mudar ela para false?

R

É que você é muito rápido, nem terminei de escrever a mensagem e você já venho com a resposta :slight_smile:

Lucas_Cavalcanti

então… não tem mto o que o VRaptor fazer… como o parâmetro não vai pra requisição, não tem como ele adivinhar que vc quer setá-lo…

workarounds:

-receba o também o parâmetro boolean no controller e chame o setter
ou
-via javascript, no formulário mande também o valor caso o checkbox não esteja marcado, tipo em um input hidden:

<input type="hidden" name="entity.situacao" id="situacao"/>
<input type="checkbox" id="situacaoCheck" <c:if test="${entity.situacao}"> checked="checked" </c:if> />   

...
<script>
   //jquery
   $(function() {
       $('#situacaoCheck').click(function() {
           $("#situacao").val($(this).is(":checked"));
       }
   }); 
</script>

algo assim deve funcionar.

R

Está tudo certo então… já estava recebendo os booleans no controller e chamando o setter manualmente. Só não entendia o porque daquele comportamento.
Nesse caso, realmente não tem nada que o VRaptor possa fazer =)

Abraços!

d34d_d3v1l

foi bom eu ler isto,
mesmo antes de ter problemas…

vlw…

Criado 12 de maio de 2012
Ultima resposta 12 de mai. de 2012
Respostas 12
Participantes 4