簡體   English   中英

如果controller方法返回ResponseEntity,如何使用spring重定向

[英]How to use spring redirect if controller method returns ResponseEntity

我想寫這樣的東西:

@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"是String,但應該是ResponseEntity

我該如何解決我的問題?

如果您沒有明確需要返回ResponseEntity您可以重新聲明您的方法,如:

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

但是,如果你需要使用ResponseEntity的話,好像你可以重定向添加到ResponseEntity描述這里

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

當您希望控制器的輸出由Spring機器進行后處理時,Spring控制器方法返回值只是糖。 如果我正確理解你在做什么,你只有兩種可能:

  • 發送代碼為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";
    }

這可以使用@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異常解析器。 但是,如果您尚未指定任何自定義異常解析程序,則默認情況下將啟用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM