天天看點

在ControllerAdvice中的ExceptionHandler方法中傳回頁面而不是Json的方式

當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>