zoukankan      html  css  js  c++  java
  • 全局异常处理--page和json接口区分处理

    import com.alibaba.fastjson.JSON;
    import com.shsxt.crm.model.ResultInfo;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.lang.reflect.Method;
    
    /**
     * Created by lyf on 2019/7/15.
     */
    @Component
    public class GlobalExceptionResolver implements HandlerExceptionResolver {
        @Override
        public ModelAndView resolveException(HttpServletRequest request,
                                             HttpServletResponse response,
                                             Object target, Exception ex) {
    
            ModelAndView mv = createDefaultModelAndView(request, ex);
    
            /***
             * 区分: 普通page页面请求和json数据请求?
             * 通过@ResponseBody注解区分
             * */
    
            if(target instanceof HandlerMethod){
                System.out.println(target);
                HandlerMethod handlerMethod = (HandlerMethod) target;
                Method method = handlerMethod.getMethod();
                ResponseBody responseBody = method.getAnnotation(ResponseBody.class);
                if(null==responseBody){
                    if(ex instanceof ParamsException){
                        ParamsException e = (ParamsException) ex;
                        mv.setViewName("error");// 可以单独设置
                        mv.addObject("errorMsg", e.getMsg());
                    }
                }else{
                    ResultInfo info = new ResultInfo();
                    info.setCode(300);// 默认错误码
                    info.setMsg("系统繁忙");// 默认错误信息
    
                    if(ex instanceof ParamsException){
                        ParamsException e = (ParamsException) ex;
                        info.setCode(e.getCode());
                        info.setMsg(e.getMsg());
                    }
    
                    /**
                     * 响应JSON到前台
                     */
    
                    response.setCharacterEncoding("utf-8");
                    response.setContentType("application/json;charset=utf-8");
                    PrintWriter pw =null;
    
                    try {
                        pw = response.getWriter();
                        pw.write(JSON.toJSONString(info));
                        pw.flush();
                        pw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if(null!=pw){
                            pw.close();
                        }
                    }
                    return null;
                }
            }
            return mv;
        }
    
        private ModelAndView createDefaultModelAndView(HttpServletRequest request, Exception ex) {
            ModelAndView mv = new ModelAndView();
            mv.setViewName("error");
            mv.addObject("errorMsg", ex.getMessage());
            return mv;
        }
    }
    
  • 相关阅读:
    (转)多线程同步event
    初始化列表中成员列出的顺序和它们在类中声明的顺序相同
    确定基类有虚析构函数
    (转)list::splice()函数详解
    MANIFEST.MF文件的格式
    NIO入门了解Buffer
    Failed to load class "org.slf4j.impl.StaticLoggerB
    线程挂起自己,让出CPU
    database如何管理超过4GB的文件
    线程同步(C# 编程指南)
  • 原文地址:https://www.cnblogs.com/linyufeng/p/13993061.html
Copyright © 2011-2022 走看看