Result do Vraptor

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:

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:
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:

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.

Alguma ideia?

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