spring 和 spirngMvc 中 异常处理

spring 中 的 异常处理 使用的是aspectj

@Aspect
@Component
/**
 *
 * @author ****
 * @createData 2017年7月13日 上午8:36:23
 * @说明 :出了一些空值。。。
 */
public class AjaxEntityHandler {

    // @Pointcut("@annotation(org.zkdg.utils.annotations.AfterHandler)")

    @Pointcut("@annotation(org.zkdg.utils.spring.annotations.NotNullVariable)")
    // @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
    public void beforeCall() {
        // service方法调用之前,检测参数,仅限第一个参数, 不能为空值
    }

    /**
     * service发生异常时调用
     */
    @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
    public void afterThrowEx() {
        System.out.println("************\n\n\n\n\n\n\n\n\n\n\n\n*******");
    }

    @Around(value = "beforeCall()")
    public AjaxEntity doBefore(ProceedingJoinPoint point) throws Throwable {
        // TODO Auto-generated method stub
        Object[] args = point.getArgs();
        if (args == null || args[0] == null) {
            return new AjaxEntity("warning", "未选择任何数据。。。");
        }
        if (args[0] instanceof String) {
            String str = (String) args[0];
            if (str.equalsIgnoreCase(""))
                return new AjaxEntity("warning", "未选择任何数据。。。");
        }

        AjaxEntity ajax = (AjaxEntity) point.proceed(args);

        return ajax == null ? AjaxEntity.ERROR("操作失败") : ajax;
    }

    /**
     *
     * @param joinPoint
     *            连接点
     * @param ex
     *            异常
     * @return AjaxEntity 异常信息
     */
    @AfterThrowing(value = "afterThrowEx()", throwing = "ex")
    public void doAfterThrowEx(JoinPoint joinPoint, Exception ex) {
        AjaxEntity ajax = new AjaxEntity();

        if (ex.getCause() instanceof SQLException) {
            // 数据库操作异常
            ajax = AjaxEntity.ERROR("操作数据库时出现异常");
        }

    }

}spring.xml 中 配置

<!-- 注解aop,支持注解 -->
<aop:aspectj-autoproxy />

事务 切点配置

<!-- 配置参与事务的类 -->
<aop:config expose-proxy="true" proxy-target-class="true">
<aop:pointcut id="txPointCut"
expression="execution(* org.dcexam.*.service.*.*(..))" />
<aop:advisor pointcut-ref="txPointCut" advice-ref="txAdvice" />
</aop:config>

注意   expose-proxy="true" proxy-target-class="true" 是 aspectj 代理  

在springMvc 中 ,由于 spring 与 springmvc 为 不同的容器。尽量不要使用aspecj代理  ,使用spring mvc 自带的 HandlerExceptionResolver 处理 异常

/**
 *
 * @author
 * @createData 2017年7月13日 下午12:27:19
 * @说明 :springMvc 异常处理
 */
//注解,被spring 扫描到
@Component
public class ExInterceptor implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        // TODO Auto-generated method stub
        if (ex != null) {
            try {
                Throwable cause = ex.getCause();
                if (cause instanceof SQLException) {
                    response.setStatus(200);

                    // json 输出
                    response.getWriter()
                            .write(JsonUtils.objectToJson(AjaxEntity.ERROR("数据库操作失败!<br>" + cause.getMessage())));
                }

            } catch (Exception e) {
                // TODO Auto-generated catch block

                e.printStackTrace();
            }

        }
        // 返回一个空的 modelandview(),必须返回,否则 异常处理配置无效。。
        return new ModelAndView();
    }

}

不得不说,spring 是真的太强大了!!!!

时间: 2024-10-10 09:22:06

spring 和 spirngMvc 中 异常处理的相关文章

基于spring注解AOP的异常处理

一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...finally对异常进行处理,但是我们真的能在写程序的时候处理掉所有可能发生的异常吗? 以及发生异常的时候执行什么逻辑,返回什么提示信息,跳转到什么页面,这些都是要考虑到的. 二.基于@ControllerAdvice(加强的控制器)的异常处理 参考文档:http://jinnianshilongnian

【夯实基础】Spring在ssh中的作用

尊重版权:http://blog.csdn.net/qjlsharp/archive/2009/03/21/4013255.aspx 写的真不错. 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来做应用层的,他它负责调用业务逻辑serivce层.所以SSH框架的流程大致是:Jsp页面----Struts------Service(业务逻辑处理类)

spring 或 springboot统一异常处理

spring 或 springboot统一异常处理https://blog.csdn.net/xzmeasy/article/details/76150370 一,本文介绍spring MVC的自定义异常处理,即在Controller中抛出自定义的异常时,客户端收到更友好的JSON格式的提示.而不是常见的报错页面. 二,场景描述:实现公用API,验证API key的逻辑,放在拦截器中判断(等同于在Controller中)并抛出异常,用户收到类似下图的提示: 其中,Http状态Code也能自由控制

基于Spring Boot的统一异常处理设计

摘自:https://www.cnblogs.com/greyzeng/p/11733327.html Practitioner 需要不断努力,才能毫不费力 基于Spring Boot的统一异常处理设计 基于Spring Boot的统一异常处理设计 作者: Grey 原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html Spring Boot中,支持RestControllerAdvice统一处理异常,在一个请求响应周期当中,如果Contro

2017年9月3日 Spring及Mybatis中连接数据库的不同方式

连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --> <!-- location:指定要读取的属性文件的位置及文件名. 注: classpath:表示依据类路径去查找 容器依据路径读取属性文件的内容, 并且将这些内容存放到Properties对象上 --> //数据库的登入数据文件 //文件名db.properties #db connectio

spring管理SessionFactory中XML配置

1. 综合练习目标 2. 综合练习需求 3.模块划分 1. 综合练习目标 <1>复习 Java 基本语法 <2>熟悉掌握Java开发常用API <3>尝试建立面向对象思想 2. 综合练习需求 <1>接收用户的命令行输入 <2>以文件为基础完成数据的增删改查操作          3.模块划分 UI模块:(Java存在文本中都是以字符型式) 数据验证模块:验证用户输入是否合法 spring管理SessionFactory中XML配置,布布扣,bub

Spring core resourc层结构体系及JDK与Spring对classpath中资源的获取方式及结果对比

1. Spring core resourc层结构体系 1.1. Resource相关结构体系 1.2. ResourceLoader相关体系 2. JDK与Spring对classpath中资源的获取方式及结果对比

Spring整合Hibernate中自动建表

Spring整合Hibernate中自动建表 博客分类: JavaEE Java代码   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> <

项目记录:spring+springmvc 项目中 @Transactional 失效的解决方法

第一步,修改spring的配置文件和springmvc的配置文件 --------------------------------applicationContext.xml <context:annotation-config/>  <context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression=&