web-dev-qa-db-ja.com

コントローラーメソッドがResponseEntityを返す場合のSpringリダイレクトの使用方法

私はこのようなものを書きたいです:

@RequestMapping(value = { "/member/uploadExternalImage",
            "/member/uploadExternalImage" }, method = RequestMethod.GET)
    public ResponseEntity<String> handleFileUpload(@RequestParam String url,@RequestParam String fileName, RedirectAttributes redirectAttributes) {
        ...
        return new ResponseEntity("Cannot save file " + fileName, HttpStatus.INTERNAL_SERVER_ERROR);
        ...
        return "redirect:/member/uploadImage";
    }

予想される動作-コントローラーにリダイレクトします。

@RequestMapping(value = { "/member/createCompany/uploadImage",
            "/member/uploadImage" })
    @ResponseBody
    public ResponseEntity<String> handleFileUpload(@Validated MultipartFileWrapper file,
            BindingResult result, Principal principal

しかし、"redirect:/member/uploadImage"は文字列ですが、ResponseEntityである必要があります

どうすれば問題を解決できますか?

16
gstackoverflow

Springコントローラーメソッドの戻り値は、コントローラーからの出力をSpring機械で後処理する場合の単なる砂糖です。私があなたが何をしているのかを正しく理解していれば、2つの可能性しかありません。

  • コード500とメッセージ"Cannot save file " + fileNameでエラー応答を送信する
  • 同じアプリケーションコンテキストで/member/uploadImageにリダイレクトします。

SpringはSendErrorよりもリダイレクトに優れているので、私のアドバイスは、メソッドに文字列を返すようにすることです。

@RequestMapping(value = { "/member/uploadExternalImage",
            "/member/uploadExternalImage" }, method = RequestMethod.GET)
    public String handleFileUpload(@RequestParam String url, @RequestParam String fileName,
            RedirectAttributes redirectAttributes, HttpServletResponse resp) {
        ...
        //return new ResponseEntity("Cannot save file " + fileName, HttpStatus.INTERNAL_SERVER_ERROR);
        resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
            "Cannot save file " + fileName); // explicitely put error message in request
        return null;  // return null to inform Spring that response has already be processed
        ...
        return "redirect:/member/uploadImage";
    }
4
Serge Ballesta

ResponseEntityを明示的に返す必要がない場合は、次のようにメソッドを再宣言できます。

public String handleFileUpload(@RequestParam String url,@RequestParam String fileName, RedirectAttributes redirectAttributes) {
    return "Cannot save file " + fileName;
    ...
    return "redirect:/member/uploadImage";
}

ただし、ResponseEntityを使用する必要がある場合は、説明に従ってResponseEntityへのリダイレクトを追加できるようです here

HttpHeaders headers = new HttpHeaders();
headers.add("Location", "/member/uploadImage");    
return new ResponseEntity<String>(headers,HttpStatus.FOUND);
21
Jordi Castilla

これは、@ExceptionHandlerアノテーションを使用して行うことができます。

  @RequestMapping(value = { "/member/uploadExternalImage", "/member/uploadExternalImage" }, method = RequestMethod.GET)
public String handleFileUpload(@RequestParam String url, @RequestParam String fileName,
        RedirectAttributes redirectAttributes) throws FileUploadException {
    ...
    throw new FileUploadException("Cannot save file " + fileName);
    ...
    return "redirect:/member/uploadImage";
}

@ExceptionHandler(FileUploadException.class)
ResponseEntity<String> handleFileUploadError(final FileUploadException e) {
  return new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}

Springが@ExceptionHandlerメソッドのエラーを処理するには、org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver例外リゾルバーが有効になっている必要があります。ただし、カスタム例外リゾルバーを指定していない場合は、デフォルトで有効になります。

2
JTP