在服务端经常会遇到需要手动的抛出异常,比如业务系统,校验异常,比较通用的处理方案是在最顶层进行拦截异常,例如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. Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

    Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法  2017年9月6日  原创分享  zencodex  使用 Laravel dingo 做api开发时,涉及 A ...

  2. MessagePack Java Jackson Dataformat - POJO 的序列化和反序列化

    在本测试代码中,我们定义了一个 POJO 类,名字为 MessageData,你可以访问下面的链接找到有关这个类的定义. https://github.com/cwiki-us-demo/serial ...

  3. python中reversed()函数的用法

    reversed(a) # 返回一个反转的迭代器 举例 a = [1, 2, 3, 4, 5] b = reversed(a) # b是一个迭代器 # print(list(b)) = [5, 4, ...

  4. 深入使用Vue + TS

    深入使用TS 支持 render jsx 写法 这里一共分两步 首先得先让 vue 支持 jsx 写法 再让 vue 中的 ts 支持 jsx 写法 让 vue 支持 jsx 按照官方做法,安装Bab ...

  5. HDU 5795 A Simple Nim ——(Nim博弈 + 打表)

    题意:在nim游戏的规则上再增加了一条,即可以将任意一堆分为三堆都不为0的子堆也视为一次操作. 分析:打表找sg值的规律即可. 感想:又学会了一种新的方法,以后看到sg值找不出规律的,就打表即可~ 打 ...

  6. How to intercept any postback in a page? - ASP.NET

    How to intercept any postback in a page? - ASP.NET There's a couple of things you can do to intercep ...

  7. Mysql 纪录用户操作日志

    有时,我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了). 二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此需要结合init-connect来实现追踪. ...

  8. vsftpd 配置上传失败553

    1查看ftp服务 ftp://ftpuser:123456@10.11.102.58:8023 2 getsebool -a | grep ftp 临时关闭 [root@xuegod63~]# get ...

  9. redis数据类型为key的常用命令

    redis默认自带16个库select 7切换到redis第8个数据库dbsize查看reids有几个keykeys *查看所有k,vclear清空控制台FLUSHDB清空当前数据库的kvFLUSHA ...

  10. kindeditor 引用js架包问题

    最近在搞kindeditor(富文本编辑器),遇到了很多插件修改无效的问题,仔细研究了一下才发现,别有洞天. 下面来介绍一下引用的js架包.具体有什么用. <!-- kindeditor.js ...