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