Olá pessoal, estou com um problema com o a resposta vinda do vraptor no firefox. Estou utilizando esta linha de código para gerar a resposta.
result.use(Results.http()).body(message).addHeader("content-type", contenttype);
Este primeiro cabeçalho funciona normalmente no firefox.
Content-Length: 6347 Content-Type: application/json;charset=UTF-8 Date: Tue, 05 Jan 2016 13:51:51 GMT Server: Apache-Coyote/1.1
porém quando o tamanho da string ultrapassa um certo tamanho, 6.5k mais ou menos, o cabeçalho enviado fica assim
Date: Tue, 05 Jan 2016 13:51:51 GMT Server: Apache-Coyote/1.1 Transfer-Encoding: chunked
Então o firefox identifica como xml, gerando uma erro de formatação incorreta, como poderia resolver este problema?
Já tentou de outras formas?
tipo assim…:
this.result.use(Results.json()).from(message).serialize();
da de dar uma customizada caso necessario …
this.result.use(Results.json()).indented().withoutRoot().from(message).serialize();
![:wink: :wink:](//www.guj.com.br/images/emoji/twitter/wink.png?v=5)
Não deu certo, o vraptor serializa errado, o message ja é a string pronta, em formato JSON, só preciso enviar ela.
E se você não serializar antes?
E enviar direto o objeto ou lista de objetos… ele vai serializar bunitao e devolver o json maroto! ![:wink: :wink:](//www.guj.com.br/images/emoji/twitter/wink.png?v=5)
Pense nisso!
Problema é que nem sempre utitlizamos todos os atributos do objeto, e também tem algumas informações que não estão nos objetos.
Entendo… nestes casos normalmente p/ retornar os dados a gente cria DTOs… que são classes apenas com a estrutura proposta para o Retorno…
Ex:
@Entity
public class Contato {
@Id
private Long id;
private String nome;
private String cpf;
private String informacaoQueNaoInteressaRetornar;
// getter & setters
}
public class ContatoDTO {
private Long id;
private String nome;
private String dadoCustomizadoApenasParaRetorno;
// getter & setters
}
Com isso o json retornado ficaria assim:
{
"id" : 1,
"nome": "Teste",
"dadoCustomizadoApenasParaRetorno": "Algum valor"
}
Essa prática é bem comum em se ter um DTO (Data Transfer Object) para estas situações.
Abs;
No proprio Hibernate quando você faz uma consulta e deseja retornar já em um outro tipo de classe como um DTO por exemplo… você pode fazer assim:
StringBuilder hql = new StringBuilder();
hql.append("select ");
hql.append(" c.nome, ");
hql.append(" [ALGUMA OUTRA CONSULTA OU ATRIBUTO] as dadoCustomizadoApenasParaRetorno ");
hql.append("from Contato c ");
hql.append("order by c.nome");
Query query = session.createQuery(hql.toString());
query.setResultTransformer(Transformers.aliasToBean(ContatoDTO .class));
return query.list();
![:wink: :wink:](//www.guj.com.br/images/emoji/twitter/wink.png?v=5)
Entendo, porém no nosso caso isso não é possível porque as informações retornadas são dinâmicas, então as vezes irá retornar só o nome, ou nome e cpf, e por ai vai… Na requisição já é especificado quais atributos devem ser retornados.
Quando você disse que o VRaptor serializou errado… como foi a saida?
Quando eu uso o withoutroot, ele transaforma cada letra em um item do json, do contrário ele cria um item e com o valor a string inteira.
Consegui resolver, coloquei o addHeader antes do metodo body, ficando assim
result.use(Results.http()).addHeader("content-type", contenttype).body(message);
Agradeço pela sua ajuda, Funcionou certinho =O
1 curtida