在服务端经常会遇到需要手动的抛出异常,比如业务系统,校验异常,比较通用的处理方案是在最顶层进行拦截异常,例如Struts的全局异常处理,而Spring的异常处理机制就相对于Struts来说好用多了

 
首先配置方案如下:
 
第一种:配置式
<!-- 基于配置文件式的异常处理 -->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
        <property name="exceptionMappings">  
            <props>  
                <prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop>
                <prop key="com.sirdc.modules.exceptions.ServiceException">error/503</prop>
            </props>  
        </property>  
    </bean>
 
第二种:注解式
 <!-- 基于注解式子的异常处理 -->
 <bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
 
然后在后端采用@ControllerAdvice注解进行处理
 
import java.util.List;
 
import javax.validation.ConstraintViolationException;
 
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.context.request.NativeWebRequest;
import org.springframework.web.servlet.ModelAndView;
 
import com.sirdc.modules.exceptions.ServiceException;
import com.sirdc.modules.validator.BeanValidators;
import com.sirdc.modules.web.model.Message;
 
/**
 * 自定义统一异常处理中心
 * @author: weihuang.peng
 * @version Revision: 0.0.1
 * @Date: 2015年1月17日
 */
@ControllerAdvice
public class DefaultExceptionHandler {
 
 /**
  * 处理业务异常
  * @param request
  * @param model
  * @param exception
  * @return Model
  */
 @ExceptionHandler({ServiceException.class})
public ModelAndView processServiceException(NativeWebRequest request, ServiceException exception) { 
      ModelAndView model = new ModelAndView("/error/503");
      model.addObject("exception", exception);
      model.addObject("message", "服务器未能处理您的请求");
      return model;
 
 /**
  * 处理校验异常
  * @param request
  * @param exception
  * @return
  */
 @ExceptionHandler({ConstraintViolationException.class})
 @ResponseBody
 public Message processConstraintViolationException(NativeWebRequest request, ConstraintViolationException exception) {
  exception.printStackTrace();
      List<String> list = BeanValidators.extractPropertyAndMessageAsList(exception, ": ");
      list.add(0, "数据验证失败:");
      return handleMessage(list.toArray(new String[] {}));
 }
 
 @ExceptionHandler({Exception.class})
 public ModelAndView processException(NativeWebRequest request, Exception exception) {
  exception.printStackTrace();
      ModelAndView model = new ModelAndView("/error/500");
      model.addObject("exception", exception);
      model.addObject("message", "服务器出错了");
      return model;
 }
 
 /**
  * 添加Flash消息
  * @param messages 消息
  * @return
  */
 protected Message handleMessage(String... messages) {
      Message model = new Message();
      StringBuilder sb = new StringBuilder();
      for (String message : messages) {
           sb.append(message).append(messages.length > 1 ? "<br/>" : "");
      }
      model.setCode("500");
      model.setMessage(sb.toString());
      return model;
 }
}

SpringMVC异常体系的更多相关文章

  1. JAVA异常体系

    1.异常体系 ----|Throwable 所有错误或异常的父类 --------|Error(错误) --------|Exception(异常)一般能通过代码处理 ------------|运行时 ...

  2. Java基础——异常体系

    在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: 所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception. ...

  3. (3)简单说说java中的异常体系

    java异常体系 |--Throwable 实现类描述java的错误和异常 一般交由硬件处理 |--Error(错误)一般不通过代码去处理,一般由硬件保护 |--Exception(异常) |--Ru ...

  4. Java异常处理-----java异常体系

    再三思考后还是决定贴图,csdn的格式,我是真玩不转,对不起了各位,继续将就吧. 错误原因:内存溢出.需要的内存已经超出了java虚拟机管理的内存范围. 错误原因:找不到类文件. 错误(Error): ...

  5. Spring揭秘读书笔记 八 数据访问异常体系

    这篇博客 来自spring揭秘一书的第十三章 为什么要有访问异常都有一个体系,这个我们得从DAO模式说起. DAO模式 任何一个系统,不管是一个最简单的小系统,还是大规模的系统,都得跟数据打交道,说白 ...

  6. Java 异常体系(美团面试)

    Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Error类描述的是 ...

  7. Java中异常体系

    Java中的异常体系 Throwable,是一个类,表示可抛出的,它是所有的异常都继承的类. Throwable的子类,又分为两种,一种是Error,另一种是Exception. Error一般不是应 ...

  8. 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链

    不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...

  9. JVM的异常体系

    任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我们还要考虑如何有效的处理异常,一个良好的异常框架对于系统来说是至关重要的.最近在采集框架的时候系统的了解一边,收获颇多,特此记录相关 ...

随机推荐

  1. Confluence 6 在一个空间中查看所有附加的文件

    有下面 2 种方法可以让你查看空间的所有附件.你可以: 使用 Space Attachments Macro 来在一个页面中显示列表文件. 进入空间后,然后从边栏的底部选择 空间工具(Space to ...

  2. JavaWeb_(Hibernate框架)Hibernate配置文件hibernate.cfg.xml

    hibernate.cfg.xml配置文件——链接数据库 hibernate.cfg.xml一定要配置在/src文件目录下 --数据库驱动,url,用户名,密码 --方言org.hibernate.d ...

  3. 安装java1.8.0

    安装java 1.删除自带jdk rpm -e --nodeps `rpm -qa | grep java` 2.查看yum库中有哪些jdk版本. yum search java | grep jdk ...

  4. TCP 之 FIN_WAIT_2状态处理流程

    概述 在主动关闭方发送了FIN之后,进入FIN_WAIT_1状态,在此状态收到了ACK,则进入FIN_WAIT_2状态,而FIN_WAIT_2后续要做的工作是等待接收对端发过来的FIN包,并且发送AC ...

  5. 在jenkins打开roboframework报告:Opening Robot Framework report failed

    来源自: https://blog.51cto.com/icestick8586/1884615 --------------------------------------------------- ...

  6. MyBatis 整合 Druid

    pom.xml 依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  7. PHP冒泡排序原生代码

    //冒泡排序 $arr=array(23,5,26,4,9,85,10,2,55,44,21,39,11,16,55,88,421,226,588); $n =count($arr); //echo ...

  8. Struts ognl表达式语言几个符号

    #  获取非根元素值  . 动态都建map集合 $  配置文件取值 %  提供一个ognl表达式运行环境 <%@ page language="java" import=&q ...

  9. flutter 单例

    flutter中的单例 class DataSave{ factory DataSave() => shared(); static DataSave _instance; DataSave._ ...

  10. nodejs相关

    安装: 1:下载 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 32 位安装包下载地址 : https://nodejs.org/dist/ ...