SpringMVC-异常处理

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;
        }


    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值