私はこのようなものを書きたいです:
@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
である必要があります
どうすれば問題を解決できますか?
Springコントローラーメソッドの戻り値は、コントローラーからの出力をSpring機械で後処理する場合の単なる砂糖です。私があなたが何をしているのかを正しく理解していれば、2つの可能性しかありません。
"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";
}
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);
これは、@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
例外リゾルバーが有効になっている必要があります。ただし、カスタム例外リゾルバーを指定していない場合は、デフォルトで有効になります。