Alterar Content-type do VRaptor para uso do AjaxUpload

Estou usando o VRaptor e o plugin javascript AjaxUpload (http://valums.com/ajax-upload/) que “simula” um ajax para upload de arquivos, após o envio do arquivo eu retorno um json para a view na seguinte formato:

ou então em caso de erros:

Porém esse plugin tem um comportamento estranho no navegador IE7 e ao retornar o json para a view o navegador tenta fazer download do arquivo.
A solução de acordo com o esse link https://github.com/valums/file-uploader/issues/47 e alterar o content-type do response para “text-html”

Existe alguma forma de eu usar o result.use(json()) da forma abaixo e alterar o Content-Type do response para “text/html”, ou eu teria que gerar o json e colocá-lo em uma String e mandar com o “result.use(http()).body(json)”;

List<Message> errors = validacaoService.validar(Anexo); result.use(json()).withoutRoot().from(erros).serialize();

Obrigado!

mesmo na requisição ajax tá pedindo pra fazer download?

Exatamente! Acredito que seja porque essa requisição Ajax que o AjaxUpload cria seja “fake”, ele na verdade cria um iframe dinamicamente e envia o arquivo por ele, sendo esse processo transparente ao usuário e não tem reload da página.

Mas quando eu gero o json e altero o content-type do response como “text/html” recebo na view sem problemas no IE7.

faz essa gambiarra então de setar o content-type pra “text/html”…

Tranquilo, eu quero fazer isso mesmo, mas minha questão é:

Existe alguma forma de fazer isso usando o result.use(json()) e alterar so o content-type, ou tenho que gerar o json separado e enviar da forma abaixo:

response.setContentType("text/html"); result.use(http()).body(json);

crie essa classe no seu projeto:

e substitua a linha do response.setContentType…

é importante que ela esteja anotada com @Component, pro VRaptor usar essa implementação ao invés da padrão

Valeu Lucas, obrigado.

E ai pessoal,

Vou aproveitar esse post, pois estou com o mesmo problema.

Estou utilizando um outro plugin do jQuery para fazer upload em Ajax, VRaptor e json como resposta. Esta acontecendo o mesmo comportamento que o NathanCR descreveu, apenas no IE.

O IE não interpreta direito o Content-Type “application/json” que o VRaptor seta e tenta fazer download no momento da resposta.

Alguém sabe de alguma outra solução para o IE entender essa resposta?

Se a única solução for alterar o Content-Type para “text/plain”, teria alguma outra solução sem criar a classe que o Lucas Cavalcanti descreveu?

Tentei isso mas não mudou o Content-Type:

[code]result.use(Results.json()).from(“resposta json”, “result”).recursive().serialize();

response.setContentType(“text/plain”); [/code]

[quote=mjl]E ai pessoal,

Vou aproveitar esse post, pois estou com o mesmo problema.

Estou utilizando um outro plugin do jQuery para fazer upload em Ajax, VRaptor e json como resposta. Esta acontecendo o mesmo comportamento que o NathanCR descreveu, apenas no IE.

O IE não interpreta direito o Content-Type “application/json” que o VRaptor seta e tenta fazer download no momento da resposta.

Alguém sabe de alguma outra solução para o IE entender essa resposta?

Se a única solução for alterar o Content-Type para “text/plain”, teria alguma outra solução sem criar a classe que o Lucas Cavalcanti descreveu?

Tentei isso mas não mudou o Content-Type:

[code]result.use(Results.json()).from(“resposta json”, “result”).recursive().serialize();

response.setContentType(“text/plain”); [/code][/quote]

Ola mjl, eu consegui resolver essa problema, mas usei uma solução, não muito elegante…

Eu criei o json com o FlexJson (http://flexjson.sourceforge.net/) e coloquei o resultado numa String e depois retornei para a visão da seguinte forma:

String json = new JSONSerializer().serialize( [objeto_que_deseja_retornar_para_visao] ); 
result.use(Results.http()).body(json).addHeader("content-type", "text/html");	

Vlw NathanCR.

Mas essa solução não deu certo pra mim. No seu caso vc usa a view http (Results.http()). Onde vc pode usar o método addHeader de HttpResult.

No meu caso a view é json. E não é possível usar o método addHeader(). Não posso alterar a view, pois tem outros lugares no projeto que utiliza json.

Tb tentei assim:

[code]result.use(Results.json()).from(“resposta json”, “result”).recursive().serialize();

VRaptorRequestHolder.currentRequest().getResponse().setHeader(“Content-Type”, “text/plain”);
[/code]
Mas tb não funcionou…

tenta criar essa classe:

@Component
public class PlainJSONSerialization implements View {
    public PlainJSONSerialization(JSONSerialization serialization, HttpServletResponse response) {
       this.serialization = serialization;
       this.response = response;
    }

    public Serializer from(Object objeto, String alias) {
          Serializer serializer = serialization.from(objeto, alias);
          response.setHeader("Content-Type", "text/plain");
          return serializer;
    }
   
}

e no controller:

result.use(PlainJSONSerialization.class).from(....).recursive().serialize();

[quote=Lucas Cavalcanti]tenta criar essa classe:

@Component
public class PlainJSONSerialization implements View {
    public PlainJSONSerialization(JSONSerialization serialization, HttpServletResponse response) {
       this.serialization = serialization;
       this.response = response;
    }

    public Serializer from(Object objeto, String alias) {
          Serializer serializer = serialization.from(objeto, alias);
          response.setHeader("Content-Type", "text/plain");
          return serializer;
    }
   
}

e no controller:

result.use(PlainJSONSerialization.class).from(....).recursive().serialize(); [/quote]

Vlw Lucas… Funcionou legal!

Com isso eu não altero o Content-Type nos outros lugares da aplicação. :slight_smile:

[]'s