2011-10-11 12 views
5

私はSpring 3.0.6を使用していますが、サーバーにファイルをアップロードするコントローラは1つあります。私はブラウザをサポートするブラウザ用のXmlHttpRequestを使用してアップロードするスクリプトを使用していますが、残りのブラウザは(隠された)マルチパートフォームを送信しています。しかし問題は、フォームがサブミットされたとき、それは次のヘッダーを送信していることである:Spring MVC、プレーンリクエストでJSON応答を強制する

Accept text/html, application/xhtml+xml, */* 

私が原因このヘッダに応答して@ResponseBody回答にマークされているコントローラが代わりにJSONをXMLに変換されていることを把握します。フォームの送信依頼をハッキングしないでこれを回避する方法はありますか?

答えて

8

あなたは@RequestMapping(produces = "application/json")を使用してJSONを強制することができます。 https://github.com/blueimp/jQuery-File-Upload/wiki

ここに私の完了方法(マイナスビズロジック)があります。私はこれが3.0で利用可能かどうか覚えていませんが、それは確実に3.1と3.2で利用可能です。

他にも触れられているように、Jacksonはクラスパス上にいる必要があります。

+0

これは良いと思いますが、Spring 3.0に該当するかわかりません。 – nvrs

+0

これにaddtionでreqeustにはこのようなAcceptヘッダーが必要ですAccept: "application/json; charset = utf-8"、spring mvcは正しい応答を構築するためにどのコンバータを使用するかを知っています。 – lukass77

1

JSONレスポンスが必要な場合は、クラスパスにJackson JARsという名前を付けることで簡単に対応できます。 Springは自動的に魔法のように拾い読みし、@ResponseBodyをJSONに変換します。

+1

しかし、私はジャクソンを使用しています。 accept:application/jsonヘッダーで要求に応答するときと同じ方法でJSONとして送信します。しかし、Spring MVCが不在のときにXMLで返信するようです。 – nvrs

0

私は

Response r = new Response(); 
    ObjectMapper mapper = new ObjectMapper(); 
    JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8); 
    try { 
     File f = uploadService.getAjaxUploadedFile(request); 
     r.setData(f.getName()); 
    } catch (Exception e) { 
     logger.info(e.getMessage()); 
     r = new Response(new ResponseError(e.getMessage(), "")); 
    } 
    mapper.writeValue(generator, r); 
    generator.flush(); 

すなわち

@ResponseBodyをオフに取り除く、代わりに手動で(常にジャクソンを使用して)変換を行って取得することにより、それがうまく作られた誰もが、別の方法を知っていますか?私は ContentNegotiatingViewResolverを設定しようとしましたが、私はjsonにすべてのhmtlを割り当てることによって他のコントローラを壊したくありません。また、カスタムのviewresolverを介してのみこのメソッドを実行しようとしましたが、応答がJSONに正しく変換されたにもかかわらず、 BeanNameViewResolverを使用すると、 HttpRequestMethodNotSupportedException:例外が発生し、リクエストメソッド 'POST'がサポートされないステータスは404になります。

2

ありがとうございます!私はまったく同じ問題を抱えていて、あなたの投稿は私の問題を解決しました。私は、このファイルアップロードプラグインでjQueryのを使用しているUIで

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public void handleUpload(@RequestParam("fileToUpload") CommonsMultipartFile uploadFile, ServletResponse response){ 

    List<UploadStatus> status = new ArrayList<UploadStatus>(); 
    UploadStatus uploadStatus = new UploadStatus(); 
    status.add(uploadStatus); 

    if(uploadFile == null || StringUtils.isBlank(uploadFile.getOriginalFilename())){ 
     uploadStatus.setMessage(new Message(MessageType.important, "File name must be specified.")); 
    }else{ 
     uploadStatus.setName(uploadFile.getOriginalFilename()); 
     uploadStatus.setSize(uploadFile.getSize()); 
    } 
    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8); 
     mapper.writeValue(generator, status); 
     generator.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
関連する問題