1.控制类测试
package com.hwy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import java.io.PrintWriter;
import java.io.StringWriter;
/*
* 通过@ExceptionHandler处理异常
* 经验:
* 1.记录日志
* 2.可以将异常转发错误页面,将错误信息存在一个隐藏的div中
* 3.@ExceptionHandler写在@Controller中只能处理当前控制器类的处理方法
* */
@Controller
public class ExceptionController {
@RequestMapping("/exception01")
public String exception01(@RequestParam("name") String name){
System.out.println("方法处理中1");
return "show";
}
@RequestMapping("/exception02")
public String exception02(@RequestParam("name") String name){
System.out.println("方法处理中2");
return "show";
}
}
2.异常处理类
package com.hwy.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
/*
* 处理全局异常
* 统一异常处理:同时处理普通请求和ajax请求
* 普通请求:返回视图,错误信息
* ajax:返回json{
* code
* message
* }
* */
@ControllerAdvice
public class GeneralExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView hanlerException(HttpServletRequest request,HttpServletResponse response,
HandlerMethod handle,
Exception ex) {
1.根据用户请求的处理方法,是否是一个返回json的处理方法
获得类上的某个注解
//RestControllerAdvice restAnnotation = handle.getClass().getAnnotation(RestControllerAdvice.class);
获取方法上的某个注解
//ResponseBody responseBody = handle.getMethod().getAnnotation(ResponseBody.class);
//if(restAnnotation!=null||responseBody!=null){}
//2.可以根据请求头中的Content-Type包含application/json
if((request.getHeader("Accept").indexOf("application/json"))>-1){
//集成jackson response.getWriter().write();
ModelAndView modelAndView =new ModelAndView(new MappingJackson2JsonView());
modelAndView.addObject("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
modelAndView.addObject("message", ex.getMessage());
return modelAndView;
}
else{
System.out.println("全局异常处理");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("ex",ex);
StringWriter sw=new StringWriter();
PrintWriter pw=new PrintWriter(sw);
ex.printStackTrace(pw);
System.out.println(sw.toString());
return modelAndView;
}
}
}