zoukankan      html  css  js  c++  java
  • SSM 全局异常

    转载: http://blog.csdn.net/m13321169565/article/details/7641978

    废话不多,直接说重点。

    一  创建异常拦截类

    (这里将  webapi 和 web异常放在一起处理。但是文件夹是两个的。关于 LogHelper.WebLog和LogHelper.ApiLog)

    参见文章:http://blog.csdn.net/hanjun0612/article/details/72639867

    public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
    
        private String defaultErrorView;
    
        public String getDefaultErrorView() {
            return defaultErrorView;
        }
    
        public void setDefaultErrorView(String defaultErrorView) {
            this.defaultErrorView = defaultErrorView;
        }
    
        /*** 
         * 异常后跳转到页面 
         */
        protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
            try {
                if (handlerMethod == null) {
                    return null;
                }
    
                Method method = handlerMethod.getMethod();
    
                if (method == null) {
                    return null;
                }
    
                ModelAndView returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
    
                ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
                if (responseBodyAnn != null) {
    
                    ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
                    if (responseStatusAnn != null) {
                        HttpStatus responseStatus = responseStatusAnn.value();
                        String reason = responseStatusAnn.reason();
                        if (!StringUtils.hasText(reason)) {
                            response.setStatus(responseStatus.value());
                        } else {
                            response.sendError(responseStatus.value(), reason);
    
                        }
                    }
    
                    return handleResponseBody(returnValue, request, response);
    
                }
    
                if (returnValue.getViewName() == null) {
                    returnValue.setViewName(defaultErrorView);
                }
    
                return returnValue;
            } catch (Exception e) {
                LogerHelper.WebLog(e.getMessage());
                return null;
            }
        }
    
    
        /**
         * 异常后 返回json
         *
         * @param returnValue
         * @param request
         * @param response
         * @return
         * @throws ServletException
         * @throws IOException
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                Map value = returnValue.getModelMap();
                HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
                List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
                if (acceptedMediaTypes.isEmpty()) {
                    acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
                }
                MediaType.sortByQualityValue(acceptedMediaTypes);
                HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
                Class<?> returnValueType = value.getClass();
                List<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();
                if (messageConverters != null) {
                    for (MediaType acceptedMediaType : acceptedMediaTypes) {
                        for (HttpMessageConverter messageConverter : messageConverters) {
                            if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
                                messageConverter.write(value, acceptedMediaType, outputMessage);
                                return new ModelAndView();
                            }
                        }
                    }
                }
                if (logger.isWarnEnabled()) {
                    logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes);
                }
                return null;
            } catch (Exception e) {
                LogerHelper.ApiLog(e.getMessage());
                return null;
            }
        }
    
    }  



    二 添加xml配置

    找到springmvc-servlet.xml

    添加:

    <bean id="handlerExceptionResolver" class="com.sanju.sanjuSCM.ExceptionResolver.AnnotationHandlerMethodExceptionResolver">
    		<property name="defaultErrorView" value="error/500.jsp"/> <!--错误页面-->
    		<property name="messageConverters">
    			<list>
    				<bean    class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
    				<!-- JSON转换器无需设置mediaType,由外部客户端调用时,手动设置相关mediaType -->
    				<bean    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
    			</list>
    		</property>
    	</bean>


    就完成了!

    ====================================================================================

    下面是我项目中用到的。
    配置文件和上面的还是一样

    public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
    
    
        private String defaultErrorView;
    
    
        public String getDefaultErrorView() {
            return defaultErrorView;
        }
    
    
        public void setDefaultErrorView(String defaultErrorView) {
            this.defaultErrorView = defaultErrorView;
        }
    
    
        /***
         * 异常后跳转到页面
         */
        protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
    
    
            Method method=null;
            ModelAndView returnValue=null;
            try {
                if (handlerMethod == null) {
                    return null;
                }
    
    
                method = handlerMethod.getMethod();
    
    
                if (method == null) {
                    return null;
                }
    
    
                returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
    
    //这里获取  @RestController和普通 @ResponseBody 的两种注解情况
                Annotation restControllerAnn = method.getDeclaringClass().getAnnotation(RestController.class);
                Annotation responseBodyAnn = restControllerAnn==null
                                ?AnnotationUtils.findAnnotation(method, ResponseBody.class)
                                :restControllerAnn;
                if (responseBodyAnn != null) {
    
    
                    ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
                    if (responseStatusAnn != null) {
                        HttpStatus responseStatus = responseStatusAnn.value();
                        String reason = responseStatusAnn.reason();
                        if (!StringUtils.hasText(reason)) {
                            response.setStatus(responseStatus.value());
                        } else {
                            response.sendError(responseStatus.value(), reason);
    
    
                        }
                    }
    
    
                    return handleResponseBody(returnValue, request, response,handlerMethod,exception);
    
    
                }
    
    
                if (returnValue.getViewName() == null) {
                    returnValue.setViewName(defaultErrorView);
                }
    
    
                return returnValue;
            } catch (Exception e) {
                SimpleDateFormat formatter =new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); ;
    
    
                String exMsg="
    
    ============================================================
    ";
                exMsg+="Date : "+(formatter.format(new Date()))+"
    
    ";
                exMsg+="ErrorMsg : "+exception+"
    
    ";
                exMsg+="ClassName : "+handlerMethod.getBean().getClass()+"
    
    ";
                exMsg+="MethodName : "+handlerMethod.getMethod().getName()+"
    
    ";
                exMsg+="Exception : "+handlerMethod +"
    
    ";
                LogerHelper.WebLog(exMsg);
                return null;
            }
        }
    
    
    
    
        /**
         * 异常后 返回json
         *
         * @param returnValue
         * @param request
         * @param response
         * @return
         * @throws ServletException
         * @throws IOException
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) throws Exception {
            ResultModel rm=new ResultModel();
            rm.setMessage(exception.getMessage());
            try {
                String json= JsonConvert.toJSON(rm);
                response.getWriter().write(json);
                response.getWriter().flush();
                response.getWriter().close();
                return null;
            } catch (Exception e) {
    
    
                SimpleDateFormat formatter =new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); ;
    
    
                String exMsg="
    
    ============================================================
    ";
                exMsg+="Date : "+(formatter.format(new Date()))+"
    
    ";
                exMsg+="reqString : "+request.getParameter("reqString")+"
    ";
                exMsg+="sign : "+request.getParameter("sign") +"
    ";
                exMsg+="ErrorMsg : "+exception+"
    
    ";
                exMsg+="ClassName : "+handlerMethod.getBean().getClass()+"
    
    ";
                exMsg+="MethodName : "+handlerMethod.getMethod().getName()+"
    
    ";
                exMsg+="Exception : "+handlerMethod +"
    
    ";
    
    
                LogerHelper.ApiLog(exMsg);
                rm.setMessage(e.getMessage());
                String json= JsonConvert.toJSON(rm);
                response.getWriter().write(json);
                response.getWriter().flush();
                response.getWriter().close();
            }
    return  null;
        }
    
    
    }  



  • 相关阅读:
    mysql的sql执行计划
    JMX
    用 Cobertura 测量测试覆盖率
    javap反汇编的使用
    Java ASM 技术简介
    基于Java Instrument的Agent实现
    浮动的同级盒子顶对齐
    子绝父相布局
    相对定位,绝对定位和固定定位
    嵌套的定位盒子如何居中?
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779808.html
Copyright © 2011-2022 走看看