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("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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
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
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