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

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,

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

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(&quot;UTF-8&quot;));
		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(&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot;);  
            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, &quot;hotelInfoResponse&quot;)
					.include(&quot;cidade&quot;, &quot;room&quot;).serialize();

Desde já muito Obrigado pela ajuda…

Abs,
Lucas

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

Oi Lucas,

Muito Obrigado pela dica. Problema Resolvido !!

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);
	}
   
}  

essa classe está sendo usada mesmo?

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

[quote=Lucas Cavalcanti]essa classe está sendo usada mesmo?

digo, a requisição está passando por ela?[/quote]

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

coloque algum log ou println dentro do seu CustomJSONSerialization

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

[quote=Lucas Cavalcanti]coloque algum log ou println dentro do seu CustomJSONSerialization

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

[/quote]

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.

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>

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

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