vRaptor + Json + Objeto Relacionado

19 respostas
F

Pessoal, em fase final do meu trabalho, restaram alguns probleminhas, dentre eles é puxar informacoes do Json de um objeto relacionado.

Tenho minha Classe Classe1 que se relaciona com a Classe 2.

na entidade, fica Classe2_id, mas como mandar via json esse resultado?

json.Classe1.Classe2 não funciona.

Pensei que talvez tenha que no vRaptor alem de mandar a Classe1, tenha que carregar a Classe 2 da Classe1 e mandar tambem.

Alguem sabe a solução ?

Obrigado!

19 Respostas

A

Tenta da seguinte forma no seu controller:

Classe1 classe1 = new Casse1();
result.use(Results.json()).from(classe1).include("classe2").include("classe3").serialize();

da uma olhada em: http://vraptor.caelum.com.br/documentacao/view-e-ajax/

abraço!

L

ou se vc não tiver relacionamentos bidirecionais vc pode fazer:

result.use(Results.json()).from(classe1).recursive().serialize();
F

alabeduarte:
Tenta da seguinte forma no seu controller:

Classe1 classe1 = new Casse1();
result.use(Results.json()).from(classe1).include("classe2").include("classe3").serialize();

da uma olhada em: http://vraptor.caelum.com.br/documentacao/view-e-ajax/

abraço!

Funcionou alabeduarte, valeu.

Lucas, em qual versão é possivel usar o método recursive ?
Comigo não funcionou.

Para receber eu uso o include e ele faz automatico, existe alguma forma de automatizar ao salvar?
hoje crio 2 objetos, classe1.inpu1, classe2.input1, e seto a classe 2 na classe1 antes de salvar.

Obrigado!

L

a partir do 3.1.1 ou 3.1.2… algum problema migrar pra 3.2.0?

não entendi o que vc quer dizer com automatizar ao salvar

abraços

F

Lucas Cavalcanti:
a partir do 3.1.1 ou 3.1.2… algum problema migrar pra 3.2.0?

não entendi o que vc quer dizer com automatizar ao salvar

abraços

Lucas, estou correndo com este trabalho, meu TCC (EE técnico) tem prazo para 1 semana, meu grupo não consegue me ajudar, esta completo na minha mão. Preciso termina-lo em 1 semana. Pretendo segui mais para frente com ele, entao posso migrar, nao quero correr o risco…

Quanto a automatização, era somente colocar classe.classe1.atributo. É tao intuitivo… =)
valeu

R

Lucas Cavalcanti:
ou se vc não tiver relacionamentos bidirecionais vc pode fazer:

result.use(Results.json()).from(classe1).recursive().serialize();

Lucas,

E se eu tenho relacionamentos bidirecionais. O que posso fazer para evitar a referencia circular?

L

vc vai precisar excluir um dos atributos (principalmente o que referencia a classe inicial)

R

Estou fazendo a busca recursiva no JSON num objeto da Classe A.

Preciso manter na hierarquia do arquivo somente a descrição da ClasseB (não preciso de nenhum outro campo da ClasseB... inclusive é um deles que causa a referencia circular...)
Tenho como fazer um include em somente um dos campos da outra classe?

//Hoje está assim
result.use(json()).withoutRoot().from(listaDaClasseA).recursive().serialize();

//Tenho como fazer isso? (não consegui)
result.use(json()).withoutRoot().from(listaDaClasseA).include("classeB.descricao").recursive().serialize();

Segue classes abaixo:

public class ClasseA
{

  @ManyToOne(optional = false)
  @JoinColumn(name = "classeB")
  private ClasseB classeB; 

}

public class ClasseB
{
//só preciso deste campo da classe B
 private String descricao = "...";

//Aqui está a referencia circular... nao preciso desse campo no JSON
 @OneToMany(mappedBy="classeB", fetch=FetchType.EAGER) 
 private List<ClasseC> lista;
}
L

tente tirar o recursive :wink:

R
L

tenta fazer só:

result.use(json()).withoutRoot().from(listaDaClasseA).include("classeB").serialize();
R

Não deu. Mesmo erro.
Tentei fazer o JSON de um único objeto em vez de fazer da lista toda e também aconteceu o mesmo erro.

L

existe um atributo com exatamente o mesmo nome que vc passou no include? isso deveria funcionar sem problemas

R

Sim.

Entidade:

public class Turma extends AbstractBaseEntity implements Cloneable 
{

@ManyToOne(optional = false)
@JoinColumn(name = "serie")
private Serie serie;

public Serie getSerie()
{
	return serie;
}

public void setSerie(Serie serie)
{
	this.serie = serie;
}

}

Controller:

@Get
	@Path("/turmas")
	public void carregar()
	{
		List<Turma> listaDeTurmas = turmas.listar();
		
		for(Turma t : listaDeTurmas)
		{
			System.out.println(t.getSerie().getDescricao());
		}
		
		result.use(json()).withoutRoot().from(listaDeTurmas).include("serie").serialize();
	}

No System.out.println esta printando o nome da série das turmas (o campo não está nulo)

L

vc tá com uma versão atual do VRaptor? tipo 3.4.0 ou 3.4.1?

R

Versão 3.4.0 aqui, vou tentar atualizar para 3.4.1

R

Valeu!!! Funcionou agora.
Esse problema nunca ia conseguir achar =)

L

=)

tem até um teste garantindo isso:

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/src/test/java/br/com/caelum/vraptor/serialization/xstream/XStreamXMLSerializationTest.java#L197" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/src/test/java/br/com/caelum/vraptor/serialization/xstream/XStreamXMLSerializationTest.java#L197" target="_blank">caelum/vraptor/blob/master/vraptor-core/src/test/java/br/com/caelum/vraptor/serialization/xstream/XStreamXMLSerializationTest.java#L197</a></h4>
<pre class="onebox"><code class="lang-java"><ol class="start lines" start="187" style="counter-reset: li-counter 186 ;">
<li>	@Test</li>
<li>	public void shouldSerializeCollectionWithPrefixTag() {</li>
<li>		String expectedResult = "  <order>\n    <price>15.0</price>\n    <comments>pack it nicely, please</comments>\n  </order>\n";</li>
<li>		expectedResult += expectedResult;</li>
<li>		expectedResult = "<orders>\n" + expectedResult + "</orders>";</li>
<li>		Order order = new Order(new Client("guilherme silveira"), 15.0, "pack it nicely, please");</li>
<li>		serialization.from(Arrays.asList(order, order), "orders").serialize();</li>
<li>		assertThat(result(), is(equalTo(expectedResult)));</li>
<li>	}</li>
<li>	@Test</li>
<li class="selected">	public void shouldIncludeFieldsFromACollection() {</li>
<li>		Order order = new Order(new Client("guilherme silveira"), 15.0, "pack it nicely, please",</li>
<li>				new Item("name", 12.99));</li>
<li>		serialization.from(Arrays.asList(order, order), "orders").include("items").serialize();</li>
<li>
</li>
<li>		assertThat(result(), containsString("<items>"));</li>
<li>		assertThat(result(), containsString("<name>name</name>"));</li>
<li>		assertThat(result(), containsString("<price>12.99</price>"));</li>
<li>		assertThat(result(), containsString("</items>"));</li>
<li>	}</li>
<li>	</li>
</ol>

(a lógica do xml é a mesma do json)

R

Legal! Nem lembrei de olhar os testes do projeto… Eu havia visto em alguns tópicos de usar include, mas aqui não estava funcionando de nenhuma maneira.

Agora, finalmente, consegui “entrar de cabeça” no VRaptor. Estamos iniciando todos os novos projetos com ele, e migrando alguns dos antigos =)
Muito bom o framework!

Criado 27 de outubro de 2010
Ultima resposta 18 de abr. de 2012
Respostas 19
Participantes 4
Casa do Codigo Casa do Codigo — Livros de tecnologia Livros de programacao, infraestrutura e inovacao
Fiap Graduacao em Tecnologia — FIAP Analise e Desenvolvimento de Sistemas, Engenharia de Software e mais