當在資料庫中找不到用戶時會拋出一個例外,我想通過 @ExceptionHandler 注釋以單獨的方法從控制器透視層處理該特定例外, 而不會丟失用戶發送的原始資料。好吧,所以,我正在使用 Sessions,我的第一次嘗試是嘗試通過 HttpServletRequest 從中取回物件,但我得到了:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'pontoEditar' available as request attribute
代碼:
@ExceptionHandler(ConversionFailException.class)
public String handleConversionFailException(HttpServletRequest request, RedirectAttributes attr) {
PontoEditarDTO ponto = (PontoEditarDTO) request.getAttribute("pontoEditar");
// I'd like to get the original object back ...
return "pontos/editar";
}
如果我使用 try-catch 塊會怎樣
@PostMapping
public String editar(@ModelAttribute("pontoEditar") PontoEditarDTO ponto, HttpSession session) {
// ... simplified.
Ponto pontoConvertido = null;
try {
pontoConvertido = pontoConverter.convert(ponto);
catch (ConversionFailException ex) {
attr.addFlashAttribute("error", "User not found!");
return "redirect:/ponto/listar";
}
// ...
return "redirect:/ponto/listar";
}
這里的簡化代碼:
public class ConversionFailException extends RuntimeException {
public ConversionFailException(String mensagem) {
super(mensagem);
}
}
- 帶 POST 的控制器。
例外發生在 POST 中: Ponto pontoConvertido = pontoConverter.convert(ponto);
@Controller
@SessionAttributes("pontoEditar")
@RequestMapping("/ponto/editar")
public class PontoEditarController {
// ... GET Removed.
@PostMapping
public String editar(@ModelAttribute("pontoEditar") PontoEditarDTO ponto, HttpSession session) {
// ... simplified.
Ponto pontoConvertido = pontoConverter.convert(ponto);
// ...
return "redirect:/ponto/listar";
}
@ExceptionHandler(ConversionFailException.class)
public String handleConversionFailException(HttpServletRequest request, RedirectAttributes attr) {
attr.addFlashAttribute("falha", "Usuário n?o foi encontrado");
/* I tried but it failed, how can i get ? */
PontoEditarDTO ponto = (PontoEditarDTO) request.getAttribute("pontoEditar");
return "pontos/editar";
}
@GetMapping("pontoEditar")
public PontoEditarDTO getPontoModel() {
return new PontoEditarDTO();
}
}
uj5u.com熱心網友回復:
您可以在例外處理程式中添加WebRequest(或 HttpSession 等)作為引數,它將由 Spring 注入。
您可以查看此處的檔案,以了解在呼叫處理程式時 Spring 可以注入哪些引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/450850.html
