springboot 统一异常处理

统一处理ajax和普通的http请求

ajax请求就返回数据提示出错,普通http请求就跳转到错误页面:

import com.yama.util.ServerResponse;
import com.yama.util.log.ExceptionUtil;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: Mr.Zzw
 * @modified by:
 * @description: deal with exception
 * @create: 2018-04-23 14:11
 **/
@ControllerAdvice
public class GlobalExceptionHandler {

      @Autowired
      private MappingJackson2HttpMessageConverter jsonConverter;

      public static final String ERROR_VIEW = "error";

      Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

      @ExceptionHandler(value = Exception.class)
      public Object errorHandler(HttpServletRequest request,
                HttpServletResponse response,Exception e)throws Exception {
          e.printStackTrace();
          if(isAjax(request)){
              return ajaxException(e,request,response);
          }else{
              return httpException(e,request);
          }

      }
/** 
* @Description: 判断是否来自于ajax请求
* @Param: [httpRequest] 
* @return: boolean 
* @Author: Mr.Zheng
* @Date: 2018/4/23 
*/ 
      public static boolean isAjax(HttpServletRequest httpRequest){
             return (httpRequest.getHeader("X-Requested-With") != null
                     &&"XMLHttpRequest".equals(httpRequest.getHeader("X-Requested-With").toString()));
      }

      /** 
      * @Description: ajax 请求出错,返回数据
      * @Param: [e] 
      * @return: com.yama.util.ServerResponse 
      * @Author: Mr.Zheng
      * @Date: 2018/5/3 
      */
      public ServerResponse ajaxException(Exception e,HttpServletRequest request,HttpServletResponse response) throws IOException{
          log.error("ajax请求出错,1:错误url"+request.getRequestURI()+"--2.错误原因:", e);
          //由于@ControllerAdvice是返回页面,@RestControllerAdvice 返回json,所有这里要设置返回的类型
          jsonConverter.write( ServerResponse.createByErrorMessage(e.getMessage()), MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response));
          return null;

      }

      /** 
      * @Description: 普通http 请求出错,返回页面
      * @Param: [e, request] 
      * @return: org.springframework.web.servlet.ModelAndView 
      * @Author: Mr.Zheng
      * @Date: 2018/5/3 
      */ 
      public  ModelAndView httpException(Exception e,HttpServletRequest request) {
          ModelAndView mav = new ModelAndView();
          mav.addObject("exception",e);
          mav.addObject("url",request.getRequestURI());
          mav.setViewName(ERROR_VIEW);
          log.error("普通http请求出错,1:错误url"+request.getRequestURI()+"--2.错误原因:", e);
          return mav;
      }

}

 

@JsonSerialize(include =JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable {

    private int status;
	private String msg;
	private T data;

    private ServerResponse(int status){
		this.status=status;
	}
	public ServerResponse(int status,T data){
		this.status=status;
		this.data=data;
	}

	private ServerResponse(int status,String msg,T data){
      this.status=status;
		this.msg=msg;
		this.data=data;

	}
	public ServerResponse(int status,String msg){
       this.status=status;
		this.msg=msg;

	}

	public static void main(String[] args) {
		ServerResponse s1=new ServerResponse(1,new Object());
		ServerResponse s2=new ServerResponse(1,"abc");
		System.out.println(	"ccc");
	}
   @JsonIgnore
	public  boolean isSuccess(){
		return this.status==ResponseCode.SUCCESS.getCode();
    }
    public  int getStatus(){
		return status;
	}
	public  T getData(){
		return data;
	}
    public String getMsg(){
		return msg;
	}



	public  static<T> ServerResponse<T> createBySuccess(){
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode() );
	}

	public  static<T> ServerResponse<T> createBySuccessMessage(String msg){
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg);
	}


	public  static<T> ServerResponse<T> createBySuccess(T data){
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
	}

	public  static<T> ServerResponse<T> createBySuccess(String msg,T data){
		return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg,data);
	}

    public  static <T> ServerResponse<T> createByError(){
		return new ServerResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
	}

	public  static <T> ServerResponse<T> createByErrorMessage(String errorMessage){
		return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
	}

	public  static <T> ServerResponse<T> createByErrorErrorCodeMessage(int errorCode,String errorMessage){
		return new ServerResponse<T>(errorCode,errorMessage);
	}

	@Override
	public String toString() {
		return "ServerResponse{" +
				"status=" + status +
				", msg='" + msg + '\'' +
				", data=" + data +
				'}';
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值