我正在努力将数据从一个控制器传递到另一个控制器。 我有一个用@ControllerAdvice注释的类,用于处理所有应用程序异常。
我正在处理异常并将它们添加到自定义类然后在ModelAndView中我添加它并使用重定向传递给另一个控制器。 在那个控制器中,我想要添加的对象,但我不知道如何获得该对象。我尝试过一些技巧,但没有成功。
代码:
ExceptionHandler类:
@ControllerAdvice
public class DefaultExceptionHandler {
@Autowired
private CPro cPro;
private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);
@RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
@ExceptionHandler(Exception.class)
@ResponseStatus(value = INTERNAL_SERVER_ERROR)
@ResponseBody
public ModelAndView handleException(Exception ex) {
ModelAndView modelAndView = new ModelAndView("redirect:/");
String exceptionType = ex.getClass().getSimpleName();
DefaultExceptionHandler.LOG.error("Internal Server Exception", ex);
ErrorResponse response = new ErrorResponse();
if (ex.getCause() != null) {
response.addSimpleError(exceptionType, ex.getCause().getMessage(), cPro.getProName());
} else {
response.addSimpleError(exceptionType, ex.getMessage(), cPro.getProName());
}
modelAndView.addObject("processingException", response);
return modelAndView;
}
}
我的家庭主管:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String getHomePage(@ModelAttribute("processingException") ErrorResponse errorResponse, Model model) {
// I want to get object data of processingException added in exception handler using ModelAndView
model.addAttribute("processingException", errorResponse.getError() == null ? null : errorResponse);
return "upscale"; //here upscale.html redirection
}
有没有人知道如何在我的控制器中获取对象数据?
感谢。
答案 0 :(得分:2)
经过大量的谷歌搜索和搜索各种论坛和文章后,我找到了一些解决方案。我已经将我的要求完成的各种论坛的数据和代码组合在一起。
我们可以使用FlashMap。只需获取请求的上下文并添加FlashMap并将其他数据添加到FlashMap中。
代码:
@ControllerAdvice
public class DefaultExceptionHandler {
@Autowired
private CPro cPro;
private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, HttpServletRequest request) throws IOException {
DefaultExceptionHandler.LOG.error("Internal Server Exception", ex);
String exceptionType = ex.getClass().getSimpleName();
ErrorResponse response = new ErrorResponse();
if (ex.getCause() != null) {
response.addError(exceptionType, ex.getCause().getMessage(), cPro.getProName());
} else {
response.addError(exceptionType, ex.getMessage(), cPro.getProName());
}
FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request);
if (outputFlashMap != null) {
outputFlashMap.put("processingException", response);
}
return "redirect:/";
}
}
另一方面,在控制器中使用ModelAttribute来获取从异常处理程序方法发送的数据。
代码:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String getHomePage(Model model, @ModelAttribute("processingException") Object processingException) {
if (processingException instanceof ErrorResponse) {
model.addAttribute("processingException", ((ErrorResponse) processingException).getError());
} else {
model.addAttribute("processingException", null);
}
return "upscale"; //here upscale.html redirection
}
毕竟宾果..完成我的工作。
如果有人对此有更好的了解,那么仍然欢迎..
谢谢你们。
答案 1 :(得分:0)
你可以这样做一个解决方法:
1
然后在您的Controller方法中,您可以访问HttpServletRequest并获取属性(对象):
public ModelAndView handleException(Exception ex, HttpServletRequest req) {
//...
ModelAndView modelAndView = new ModelAndView("forward:/");
//...
req.setAttribute("processingException", response);