1.创建一个类,实现HandlerExceptionResolver
public class ExceptionResolver implements HandlerExceptionResolver { private HttpMessageConverter<ExceptionResultInfo> mappingJacksonHttpMessageConverter; @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 输出 异常信息 ex.printStackTrace(); // 转成springmvc底层对象(就是对action方法的封装对象,只有一个方法) HandlerMethod handlerMethod = (HandlerMethod) handler; // 取出方法 Method method = handlerMethod.getMethod(); //判断方法是否返回JSON //只要方法中含有ResponseBody就是返回的JSON ResponseBody responseBody = AnnotationUtils.findAnnotation(method,ResponseBody.class); ModelAndView modelAndView = new ModelAndView(); if(responseBody != null){//不为空表示是JSON Body body = null; //解析异常信息为JSON ExceptionResultInfo exceptionResultInfo = null; //判断异常是否是自定义的异常 if(ex instanceof SystemException){ //如果是,抛出自定义异常 body = new Body(); body.setMsgCode(((SystemException) ex).getMsgCode()); body.setMsgDes(((SystemException) ex).getMsgDes()); }else{ //如果不是自定义异常,则直接抛出未知错误, body = new Body(); body.setMsgCode("0x00001"); body.setMsgDes("未知错误"); } exceptionResultInfo = new ExceptionResultInfo(body,"00"); //输出JSON到页面 HttpOutputMessage outputMesage = new ServletServerHttpResponse(response); try { mappingJacksonHttpMessageConverter.write(exceptionResultInfo, MediaType.APPLICATION_JSON,outputMesage); } catch (IOException e) { e.printStackTrace(); } return new ModelAndView(); }else{//为空,表示返回的是JSP页面 //直接跳转到错误页面 modelAndView.setViewName("/error/error");// 逻辑视图名 } return modelAndView; } public HttpMessageConverter<ExceptionResultInfo> getMappingJacksonHttpMessageConverter() { return mappingJacksonHttpMessageConverter; } public void setMappingJacksonHttpMessageConverter(HttpMessageConverter<ExceptionResultInfo> mappingJacksonHttpMessageConverter) { this.mappingJacksonHttpMessageConverter = mappingJacksonHttpMessageConverter; } }
2.springmvc.XML中
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean><!-- 统一异常处理类 --> <bean id="handlerExceptionResolver" class="pnc.mesadmin.interceptor.ExceptionResolver"> <!-- 注入一个json转换器 --> <property name="mappingJacksonHttpMessageConverter" ref="mappingJacksonHttpMessageConverter" /> </bean>3.web.XML中<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <init-param> <param-name>detectAllHandlerExceptionResolvers</param-name> <param-value>false</param-value> </init-param> </servlet>