vRaptor + Json + Objeto Relacionado

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!

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!

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

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

[quote=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![/quote]

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!

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

[quote=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[/quote]

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

[quote=Lucas Cavalcanti]ou se vc não tiver relacionamentos bidirecionais vc pode fazer:

result.use(Results.json()).from(classe1).recursive().serialize(); [/quote]

Lucas,

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

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

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:

[code]
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 lista;
}[/code]

tente tirar o recursive :wink:

tenta fazer só:

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

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.

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

Sim.

Entidade:

[code]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;
}

}[/code]

Controller:

[code]@Get
@Path("/turmas")
public void carregar()
{
List listaDeTurmas = turmas.listar();

	for(Turma t : listaDeTurmas)
	{
		System.out.println(t.getSerie().getDescricao());
	}
	
	result.use(json()).withoutRoot().from(listaDeTurmas).include("serie").serialize();
}[/code]

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

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

Versão 3.4.0 aqui, vou tentar atualizar para 3.4.1

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

=)

tem até um teste garantindo isso:

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

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!