[RESOLVIDO] Vraptor + Google protobuf

4 respostas
rogerio.alcantara

Olá Jedis do GUJ, tudo bom?

Estou utilizando o protobuf para trafegar dados entre uma app mobile e o um site.

Preciso que a minha action, retorne o resultado do build do protobuf.

Gostaria de uma sugestão de qual seria a melhor estratégia para esse cenário?

Crio algum result diferente, que determine o response.contentType("application/x-protobuf")?
public class MobileController {

   @Get
	public final AuthenticationProto.Authentication authenticate(final String login, final String password) throws IOException {

              final AuthenticationToken authentication = this.service.authenticate(login, password);

              final AuthenticationProto.Authentication proto = AuthenticationProto.Authentication.newBuilder()
                                                               .setStatus(AuthenticationProto.Authentication.Status.SUCCESS)
                                                               .setToken(authentication.getToken())
                                                               .build();

              this.getResponse().setContentType("application/x-protobuf");

              this.getResult().nothing();

              return proto;
        }
}
Ou devo escrever no outputstrem do response direto?
public class MobileController {

   @Get
	public final void authenticate(final String login, final String password) throws IOException {

			final AuthenticationToken authentication = this.service.authenticate(login, password);

            final AuthenticationProto.Authentication proto = AuthenticationProto.Authentication.newBuilder()
                                                                .setStatus(AuthenticationProto.Authentication.Status.SUCCESS)
                                                                .setToken(authentication.getToken())
                                                                .build();

            this.getResponse().setContentType("application/x-protobuf");

            proto.writeTo(this.getResponse().getOutputStream());

            this.getResult().nothing();
       }
}
Qual é a melhor estratégia VRaptor?

Valeu turma, um abração.

4 Respostas

Lucas_Cavalcanti

O melhor jeito seria usar um Download:

return new InputStreamDownload(conteudo, "application/x-protobuf", "algum nome", fazerDownload, tamanho);
rogerio.alcantara

Olá Lucas, tudo bom?

Muito obrigado pela sugestão, farei isso, por enquanto...

Mas não ficaria mais bonitinho se retornar o objeto e receber o objeto do tipo proto - como o vraptor já faz com os outros. Tipo:
@Get  
public final XptoProto.Xpto authenticate(final String login, final String password) throws IOException {  

   return proto;//na serialização ele chama o metodo build do protobuf
}
@Post  
public final void save(final XptoProto.Xpto entity) throws IOException { //ao receber o objeto, chama o metodo do leitura do protobuf.. 

}
Se eu quisesse implementar essa feature, o q eu deveria fazer? Tem algum exemplo? Ou não acha uma boa abordagem?

Valeu, um abraço.

Lucas_Cavalcanti

vc pode criar uma classe assim:

public class ProtoDownload implements Download {
   //recebe o proto no construtor
   // delega a chamada pra um InputStreamDownload, ou coisa do tipo
}

assim como tá feito nesse cara:

rogerio.alcantara

Funcionou perfeitamente!

O código: https://gist.github.com/2352850

Muito obrigado pela sugestão Lucas.

Um abração.

Criado 9 de abril de 2012
Ultima resposta 10 de abr. de 2012
Respostas 4
Participantes 2