【问题标题】:How to use spring redirect if controller method returns ResponseEntity如果控制器方法返回 ResponseEntity,如何使用弹簧重定向
【发布时间】:2015-08-24 13:58:26
【问题描述】:

我想写这样的东西:

@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

我该如何解决我的问题?

【问题讨论】:

  • 声明public String handleFileUpload(@RequestParam String url,@RequestParam String fileName, RedirectAttributes redirectAttributes) 不允许您重定向?
  • @Jordi Castilla 我需要返回 http 代码
  • 检查我的答案并链接一个......认为它会为你工作

标签: java spring spring-mvc redirect


【解决方案1】:

如果您不明确需要返回 ResponseEntity,您可以重新声明您的方法,例如:

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

但是如果您需要使用ResponseEntity,那么您似乎可以按照here 的描述添加到ResponseEntity 的重定向。

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

【讨论】:

  • 在第二种情况下 HttpStatus.FOUND 的含义是什么?
  • 是类HttpStatus代码302(找到)的另一个值,就像你返回时HttpStatus.INTERNAL_SERVER_ERROR是代码500(内部服务器错误)
  • 我需要服务器重定向。
  • 我敢打赌它可以适应本地重定向,请查看thisthis Spring 论坛帖子的第二个选项,
【解决方案2】:

当您希望控制器的输出由 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";
    }

【讨论】:

【解决方案3】:

这可以使用@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 异常解析器。但是,如果您没有指定任何自定义异常解析器,它将默认启用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2013-01-11
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2014-04-27
    相关资源
    最近更新 更多