Vraptor 3 + xStream + <?xml version="1.0" encoding="UTF-8"?>

12 respostas
L

Olá a todos,

Sou novo aqui e esse é o meu primeiro Post.

Estou usando a versão 3.1.3.xxx do Vraptor e me deparei com a seguinte situação: Estou serializando um resultado em XML mas o Vraptor/xStream não coloca a tag <?xml version="1.0" encoding="UTF-8"?>.

Pelo que pude ler na documentação do xStream e em algumas mensagens aqui do Fórum isso é uma "deficiência" do próprio xStream, porém, vi em alguns lugares que o correto serial dar um append dessa String no retorno. Fiz alguns testes e isso realmente resolve o problema.

A minha dúvida é como fazer isso através do Vraptor pois serializo dessa forma:

result.use(Results.xml()).from(listaResposta,’‘listaResposta’’).serialize();

Desde já muito obrigado,

12 Respostas

Lucas_Cavalcanti

crie a classe:

@Component
public class CustomXMLSerialization extends XStreamXMLSerialization {
   private final HttpServletResponse response;
   public CustomXMLSerialization(..., response) {
       super(...);
       this.response = response;
   }

   @Override
   public Serializer from(object, alias) {
           response.getWriter().println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
           return super.from(object, alias);
   }
}

daí toda vez que vc usar o result.use(xml()) ele vai adicionar o cabeçalho do xml… (vc vai ter que sobrescrever o outro método from tb)

[]'s

L

Oi Lucas,

Muito Obrigado pela ajuda, mas ainda fiquei com algumas dúvidas:

Eu já usava essa classe por conta das anotações do xStream, antes ela estava assim:

@Component
public class CustomXMLSerialization extends XStreamXMLSerialization {
	private final HttpServletResponse response;

	public CustomXMLSerialization(HttpServletResponse response,
			TypeNameExtractor extractor, ProxyInitializer proxy) {
		super(response, extractor, proxy);
		this.response = response;
	}

	@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver("UTF-8"));
		xStream.processAnnotations(HotelInfoResponse.class);
		xStream.processAnnotations(HotelInfoApartament.class);
		xStream.processAnnotations(HotelTariffSearchResponse.class);
		xStream.processAnnotations(HotelTariffSearchApartament.class);
		xStream.processAnnotations(HotelTariffSearchTariff.class);

		return xStream;
	}
	 
}

Após a mensagem, tentei adicionar o método citado:

@Override  
    public Serializer from(object, alias) {  
            response.getWriter().println("&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;");  
            return super.from(object, alias);  
}

Mas tive alguns erros de compilação, muito provavelmente por cota da assinatuta do método (object, alias) eles são de que classe ?

Também fiquei em dúvida em qual seria o outro método from que você falou na mensagem.

Segue abaixo a minha chamada:

result.use(Results.xml()).from(listaResposta, "hotelInfoResponse")
					.include("cidade", "room").serialize();

Desde já muito Obrigado pela ajuda…

Abs,
Lucas

Lucas_Cavalcanti

se vc usa o eclipse, vai no corpo da classe (dentro da classe e fora de qqer método)
digite from e aperte Ctrl+espaço
escolha override method from on …

depois faça isso de novo e faça override no outro método from

L

Oi Lucas,

Muito Obrigado pela dica. Problema Resolvido !!

renatomattos2912

Vim pra desenterrar o topico huauha

Fiz a seguinte classe a abaixo porem ela nao esta funcionando no meu caso, a tag de utf-8 nao esta aparecendo no meu xml:

@Component  
public class CustomXMLSerialization extends XStreamXMLSerialization {
	private final HttpServletResponse response;
	
	public CustomXMLSerialization(HttpServletResponse response,
			TypeNameExtractor extractor, ProxyInitializer initializer,
			XStreamBuilder builder) {
		super(response, extractor, initializer, builder);
		
		this.response = response;
	}  
   
	@Override
	public <T> Serializer from(T object) {
		try {
			response.getWriter().println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.from(object);
	}
	
	@Override
	public <T> Serializer from(T object, String alias) {
		try {
			response.getWriter().println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.from(object, alias);
	}
   
}
Lucas_Cavalcanti

essa classe está sendo usada mesmo?

digo, a requisição está passando por ela?

renatomattos2912

Lucas Cavalcanti:
essa classe está sendo usada mesmo?

digo, a requisição está passando por ela?

Creio que sim, a nao ser que falte eu fazer algo, no momento eu apenos tenho a classe citada acima criada e faço a chamada para criar o xml da seguinte forma abaixo:

@Path("/sitemap")
	public void sitemap() {
		List<Url> urlList = sitemapRepository.listaUrl();
		Sitemap sitemap = new Sitemap();
		
		sitemap.setUrls(urlList);

		try{
        	result.use(Results.xml())
        	.from(sitemap, "urlset")         	
        	.include("urls")
        	.exclude("urls.id", "urls.date", "urls.escola")
    		.serialize();
        }catch(Exception e){
        	System.out.println(e);
        }
	}

nao sei se falta algo

Lucas_Cavalcanti

coloque algum log ou println dentro do seu CustomJSONSerialization

e tire o try…catch do método sitemap.

renatomattos2912

Lucas Cavalcanti:
coloque algum log ou println dentro do seu CustomJSONSerialization

e tire o try…catch do método sitemap.

Fiz o q voce falou e constatei que sim, ele passa pela classe e executa o segundo metodo que é o “public Serializer from(T object, String alias)” mas ao ver no chrome o xml gerado realmente nao mostra a tag, aparentemente esta tudo certo fora o bjetivo que nao esta sendo alcançado.

renatomattos2912

segue o inicio do xml caso sirva pra ajudar em algo:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>35115423-colegio-pedro-peralta</loc>
<lastmod>2013-09-27 00:00:00.0</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>35801288-instituto-educacional-doce-vida</loc>
<lastmod>2013-09-27 00:00:00.0</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>

...
</url>
Lucas_Cavalcanti

você chegou a olhar o código fonte da página, ou baixar o xml num arquivo pra verificar se não funcionou mesmo?

renatomattos2912

Po cara vlw, era isso, fiz download do arquivo e ao abrir apareceu, muito obrigado

Criado 2 de junho de 2010
Ultima resposta 28 de set. de 2013
Respostas 12
Participantes 3