Как использовать 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
сельсин исключения включена. Однако, если вы не указали настраиваемые разрешители исключений, он будет включен по умолчанию.