當Controller中發生錯誤,進而進入了
@ControllerAdvice
注解标注的類中的
@ExceptionHandler(Exception.class)
标注的方法時,如果想傳回json資料,隻需要在該方法上标注
@ResponseBody
,就會将方法的傳回值以Json的方式發送給調用者。可是有時候想傳回一個html頁面,或者ftl模版生成的html頁面給通路者。那麼此時需要該方法傳回一個
ModelAndView
對象,如下所示:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class BusinessExceptionHandler {
/**
* BusinessException是自定義異常
*/
@ExceptionHandler(BusinessException.class)
public ModelAndView handleRRException(BusinessException e) {
//注意這兒要自己new一個ModelAndView對象,不能直接在方法參數BusinessException e後寫ModelAndView mv
ModelAndView mv = new ModelAndView();
//error是靜态資源根目錄下的error.ftl模版的視圖名稱
mv.setViewName("error");
mv.addObject("e", e);
return mv;
}
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
BusinessException e = new BusinessException(ex.getMessage());
mv.addObject("e",e);
return mv;
}
}
FreeMarker模版error.ftl中的内容如下:
<#--error.ftl檔案是預設的出錯頁面-->
<h1>遇到了錯誤</h1>
<h2>錯誤碼:${e.code!''}</h2>
<h2>錯誤資訊:${e.msg!''}</h2>