[RESOLVIDO] - Como vocês estão fazendo para serializar objetos no GAE+VRaptor

21 respostas
D

Estive tentando esses dias usar o VRaptor e ao serializar objetos para usar com ajax, me apresentou alguns erros referente as limitações impostas pelo GAE ao usar o XStream.
Procurei pela net, até encontrei um “fork” xstream-gae, mais ainda assim tive problema.

o que eu queria fazer é relativamente simples:

result.use(Results.json()).from(meuObjeto).serialize();

Um erro que eu encontrei esta nesse link: http://groups.google.com/group/google-appengine-java/browse_thread/thread/96442cc90c55d90f

Usei uma solução também postada no link, mais ainda assim não deu certo.

21 Respostas

G

Pois é, vou aproveitar teu post para uma outra perguntinha…

Eu tenho uma plataforma de blogging feito em Vraptor. Essa semana estive analisando abrir o fonte dela e pensei: será que valeria a pena fazer ela para uso no GAE/J? Essas limitações todas além de ter a aplicação muito amarrada com as limitações do JPA4Bigtable?

D

Só para complementar, meu cenário é o seguinte,
Essa aplicação terá duas versões, uma que será a aplicação em si, onde o usuário acessar normalmente através de uma url, e outra onde será servido somente os recursos rest, para ser acoplado no site ou sistema do cliente.
Usando o vraptor eu conseguiria fazer isso sem trabalho extras, pois teria tudo isso já np framework.

Resumindo seria uma aplicação web e um provedor de recursos rest.

D

Pois é garcia-jj, eu já me perguntei isso também, mais também não achei uma solução ao menos parecida com isso uma PAAS(Plataforma as Services).

Alguma sugestão de outra PAAS?

L

@davisnog

Se o XStream não funciona no GAE, vc pode tentar fazer uma implementação mais simples do JsonSerializer que não dependa do XStream, pelo menos por enquanto…

basicamente vc precisa implementar duas classes:

@Component
public class SimpleJSONSerialization implements JSONSerialization {

    //metodos
   public Serializer from(Object object) {
         return new SimpleJSONSerializer(....);
   }
}

e

public class SimpleJSONSerializer implements Serializer {
    //metodos
}

vc pode só implementar os métodos que vc está usando…

qdo o problema do XStream for resolvido, vc pode só apagar a sua implementação (ou tirar o @Component) e tudo vai continuar funcionando…

essa solução é viável?

D

Até me pareceu mais tranquilo, vou tentar algo.

Outro recurso que eu acho interessante e iria utilizar no VRaptor é o Representation, dessa forma eu teria duas forma de fornecer o mesmo recurso.

jaxb, seria possivel para essa solução?

L

teoricamente sim, mas acho que JAXB só gera XML, não?

G

Sim, JAXB gera apenas XML (por isso o X no nome: Java Architecture for XML Binding).

Eu tenho vontade de usar JAXB no vraptor, porém o JAXB precisa de pelo menos uma anotação no elemento root (@XmlRootElement), indicando que ele é root.

L

nada impede de vc colocar essas anotações nas suas classes de modelo, não é verdade :wink:

de qqer forma, é possível que dê pra fazer uma configuração programática no JAX-B (faz mto tempo que eu não mexo com ele, mas lembro de ter visto algo parecido)

D

Pesquisando, encontrei o Jackson [url]http://jackson.codehaus.org/[/url], que gera os objetos json baseado nas anotações jaxb.

Eu cheguei a criar um projeto demo usando JSF+Spring+Jersey(jaxb+jax-rs), deu um pouco de trabalho juntar tudo, mais até o momento deu certo, mais ainda não ficou como eu gostaria que ficasse.

a implementação que faço para gerar os recursos são simples: O dominio
@Entity
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person implements Serializable {

//atributos e getters e setters
}

//o Recurso

@Path("/person")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class PersonResource {}

Nesse caso eu tenho os recursos rest, mais não tenho as uris bonitinhas para acesso na aplicação, até tem como fazer isso com o jsf usando o [url]http://ocpsoft.com/prettyfaces/[/url], mais já esta ficando muita configuração para ser usada.

Pra se ter ideia para acessar os recursos rest e as paginas jsf, tenho que ter uris diferentes, nesse caso para acessar uma pagina pessoa.jsf por exemplo eu faria assim:

www.aplicacao.com.br/person.jsf

já para acessar os recursos faço assim:

www.aplicacao.com.br/rest/person

Faço isso por causa de conflitos das tecnologias, se eu acessar o recurso e a pagina jsf na mesma uri, não acontece nada, simplesmente me aparece uma pagina em branco.

D

Outra coisa, tanto o Jersey quanto o Resteasy, utilizam o Jackson para serializalizar objetos em json.

L

me parece então que, usando esse jackson é só fazer no SimpleJSONSerializer.serialize():

new ObjectMapper().writeValue(response.getWriter(), objeto);
D

Implementei a Interface XMLSerialization, ficou assim:

@Override
	public <T> Serializer from(final T arg0) {
		
		Serializer serializer = new Serializer() {

			@Override
			public void serialize() {
				
				try {
					
					JAXBContext context = JAXBContext.newInstance(arg0.getClass());
					Marshaller marshaller = context.createMarshaller();
				    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
				     
					//HttpServletResponse
				    marshaller.marshal(arg0, response.getWriter());
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			
			//demais metodos omitidos, não fiz nada com eles
		};
		
		return serializer;
	}

E também JSONSerialization;

@Override
	public <T> Serializer from(final T arg0) {
		
		Serializer serializer = new Serializer() {
			
			@Override
			public void serialize() {
				try {
					
					ObjectMapper mapper = new ObjectMapper();
					AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
				    mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);
				    mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
					
					//response=HttpServletResponse
					mapper.writeValue(response.getWriter(), arg0);
					
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
			
			//demais metodos omitidos, não fiz nada com eles
		};
		
		return serializer;
	}

os jars usados para substituir o xstream foram:

jaxb-api-2.1.jar
jaxb-impl-2.1.12.jar
jackson-core-asl-1.5.5.jar
jackson-mapper-asl-1.5.5.jar
jackson-xc-1.5.5.jar

Para Results.xml(), e Results.json(), no pequeno teste que eu fiz deu certo, serializou conforme eu queria, já para Results.representation(), me parece que o VRaptor chama algum metodo da classe XStreamJSONSerialization, e da o mesmo erro de restrição do GAE.

Talvez seja necessário ajustes nesse código que eu implementei, quanto ao Results.representation(), tem alguma configuração que eu faça para ele invocar as classes que eu implementei?
E quanto ao Restfulie, será que ele vai invocar as minhas implementações de Serializer?

L

vc implementou o método

public boolean accepts(String format);

?

vc tah falando do restfulie cliente ou o servidor?

D

accepts? Não, e nesse caso como ficaria a implementação (json/xml)?

Restifulie seria no servidor.

L

vc precisa retornar true se for “application/json” e “application/xml” respectivamente… se quiser aceitar “text/javascript” e “text/xml” tb…

e o restfulie do servidor vai usar os serializers do vraptor sim

D

Ví o codigo fonte do VRaptor e vi que o restifulie também usa o XStrem para serialilzar.

Nesse caso não vai me servir. Essa aplicação que estou fazendo é uma demo para o meu TCC, onde usarei como infraestrutura cloud e rest.

Dessa forma eu consigo usar o GAE, gratuito para a apresentação do TCC.
Esse vai ser um dos tópicos mensionados, a limitação do GAE.

Mais em todo caso, muito obrigado pela ajuda.

L

o Restfulie servidor pra Java é o VRaptor :wink:

D

Sim sim, eu ainda estou estudando sobre o assunto, mais a idéia de hipermidia proporcionada pelo Restfulie, o arquivo gerado seria um xml no formato atom?

G

Eu tenho uma dúvida grande sobre o que é o restfulie. Ele serve ou consome webservices? Ou nenhum? :oops:

L

sim, se vc configurar as transições e tudo o mais ele gera os links no formato atom

Ele serve E consome webservices REST, ou como muitos chamam, RESTful services
http://restfulie.caelum.com.br

D

Valeu Lucas, estive vendo no github tem a versão client do restfulie em javascript, show de bola, vai me ajudar em algumas coisas.

Até mais pessoal

Criado 29 de julho de 2010
Ultima resposta 31 de jul. de 2010
Respostas 21
Participantes 3