java项目全局异常拦截

java项目通常是由多人合作开发,但每个人的水平和想法又不一样,在开发中并不能有效的避免所有异常都能够有效的捕捉并处理,所以我们需要一个全局的异常拦截处理,只需要配置一个拦截器即可。

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.ModelAndView;

 

import com.alibaba.fastjson.support.spring.FastJsonJsonView;

import com.bingchuangapi.common.constant.Constants;

 

 

@Component

public class SpringHandlerExceptionResolver implements HandlerExceptionResolver {

 

@Override

public ModelAndView resolveException(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex) {

ModelAndView mv = new ModelAndView();

/* 使用FastJson提供的FastJsonJsonView视图返回,不需要捕获异常 */

FastJsonJsonView view = new FastJsonJsonView();

Map<String, Object> attributes = new HashMap<String, Object>();

attributes.put(Constants.RET_CODE, "111");

attributes.put(Constants.RET_MSG, "服务器异常,请稍后再试");

view.setAttributesMap(attributes);

mv.setView(view);

ex.printStackTrace();

return mv;

}

}

 

<bean id="exceptionHandler" class="com.bingchuangapi.common.base.SpringHandlerExceptionResolver" />

但这样我们只知道有异常,如果有人捕捉了异常,但没有把异常打印出来,在我们看日志的时候会非常蛋疼,明明有问题但日志中没法体现出来,此时只需要写一个aop即可

import java.text.SimpleDateFormat;

import java.util.Date;

 

import javax.servlet.http.HttpServletRequest;

 

import org.apache.log4j.Logger;

import org.aspectj.lang.JoinPoint;

import org.springframework.aop.ThrowsAdvice;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

 

public class AspectService implements ThrowsAdvice

{

Logger logger=Logger.getLogger(AspectService.class);

//配置抛出异常后通知,使用在方法aspect()上注册的切入点

public void afterThrow(JoinPoint joinPoint, Exception ex){

 

logger.info("进入切面AfterThrowing方法中...");

//判断日志输出级别

if(logger.isInfoEnabled()){

logger.info("afterThrow " + joinPoint + "\t" + ex.getMessage());

}

//详细错误信息

String errorMsg = "";

StackTraceElement[] trace = ex.getStackTrace();

for (StackTraceElement s : trace) {

errorMsg += "\tat " + s + "\r\n";

}

 

//写入异常日志

writeLog(errorMsg,joinPoint,ex);

 

}

 

 

/**

*

* @param detailErrMsg 详细错误信息

* @param method 方法名称

* @Description: 日志异常

* @author: Ma

* @createTime: 2016-10-14

*/

public void writeLog(String detailErrMsg,JoinPoint joinPoint,Exception ex){

 

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.

getRequestAttributes()).getRequest();

//获取请求的URL

StringBuffer requestURL = request.getRequestURL();

//获取参 数信息

String queryString = request.getQueryString();

//封装完整请求URL带参数

if(queryString != null){

requestURL .append("?").append(queryString);

}

 

String cla=joinPoint.getTarget().getClass().getName();//action

String method=joinPoint.getSignature().getName();//method

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//FileOutputStream out=new FileOutputStream(file,false); //如果追加方式用true

//日志具体参数

StringBuffer sb=new StringBuffer();

sb.append("-----------"+sdf.format(new Date())+"------------\r\n");

sb.append("远程请求URL["+requestURL+"]\r\n");

sb.append("接口方法:["+cla+"."+method+"]\r\n");

sb.append("详细错误信息:"+ex+"\r\n");

sb.append(detailErrMsg+"\r\n");

logger.info(sb);

}

 

}

 

配置如下

<!-- 激活自动代理功能 -->

<aop:aspectj-autoproxy proxy-target-class="false"/>

<!-- 系统服务组件的切面Bean -->

<bean id="aspectService" class="com.**.log.AspectService"></bean>

<!-- AOP配置 -->

<aop:config>

<!-- 声明一个切面,并注入切面Bean,相当于@Aspect -->

<aop:aspect id="simpleAspect" ref="aspectService">

<!-- 配置一个切入点,相当于@Pointcut -->

<aop:pointcut expression="execution(* com.***.common..*(..))" id="simplePointcut"/>

<aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>

</aop:aspect>

</aop:config>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值