Как использовать spring redirect, если метод контроллера возвращает 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" - строка, но должна быть ResponseEntity

как я могу решить мою проблему?

3 ответов


возвращенные значения метода регулятора весны как раз сахар когда вы хотите выход от регулятора быть столбом обрабатываемым машинным оборудованием весны. Если я правильно понял, что вы делаете, у вас есть только 2 возможности:

  • отправить сообщение об ошибке с кодом 500 и
  • перейти к /member/uploadImage в том же контексте приложения.

как весна обеспечивает больше вкусностей для перенаправления, чем для 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";
    }

если вы не explicity нужно вернуть 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);

Это можно сделать с помощью @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);
}

для того, чтобы весна обрабатывала ошибку в вашем @ExceptionHandler метод, требуется, чтобы у вас было org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver сельсин исключения включена. Однако, если вы не указали настраиваемые разрешители исключений, он будет включен по умолчанию.