spring3 struts2 利用aop在actioin层捕获异常

12 篇文章 0 订阅
5 篇文章 0 订阅
spring3 struts2 利用aop在actioin层捕获异常

dao service action 层都没有处理异常,所以写了一个捕获异常的类,利用spring 的aop ,自动捕获,并输出。

spring 中的配置:
<!-- 配置拦截器代理 -->
<aop:config  proxy-target-class="true">
  <aop:aspect  id="transactionPointcut" ref="exceptionPointcut" >
   <aop:pointcut id="myPointcut" expression="execution(* ysusoft.action.*Action.*(..))" />
   <aop:after-throwing pointcut-ref="myPointcut" method="doExceptionAction" throwing="e"/>
  </aop:aspect>
 </aop:config>
 <bean name="exceptionPointcut" class="ysusoft.util.ExceptionAdvisor"/>



ExceptionAdvisor.java:

package xxx.util;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class ExceptionAdvisor {
 
 /**
     * 对action层中方法产生的异常的处理.
     * @param joinPoint 连接点
     * @param e 异常信息
     */
    public void doExceptionAction(JoinPoint joinPoint, Exception e){
        String targetName = joinPoint.getTarget().getClass().getName();  
        String methodName = joinPoint.getSignature().getName();  
        System.out.println("targetName:"+targetName);
        System.out.println("methodName:"+methodName);
        e.printStackTrace();
        Object[] objs = joinPoint.getArgs();
        for(int i=0;i<objs.length;i++){
         System.out.println(objs[i].toString());
        }
    }  
}



action 中的代码:

 public void login() {
   Json j = new Json();
   User t = userService.login(tUser);
   if (t != null) {
    j.setSuccess(true);
    initSession(t);
    logger.info("登录成功");
   } else {
    j.setMsg("登录失败");
    logger.error("登录失败");
   }
  super.writeJson(j);    
 }


service:

 @Override
 public User login(User t) {
  Map<String, Object> map = new HashMap<String, Object>();
  /*if(1/0>1)
   return null;*/
  map.put("fname", t.getFusernum());
  String md5password=Encrypt.md5AndSha(t.getFpwd());
  map.put("fnumber", md5password);
  String hql = "from TUser t where t.fusernum = :fname and t.fpwd = :fnumber";
  TUser tUser = userDao.get(hql,map );
  if (tUser!=null){
  if(tUser.getZba020t()!=null&& !tUser.getZba020t().equals("")){
   t.setFuserGup(tUser.getZba020t().getF0());
  }
  t.setF0(tUser.getF0());
  return t;}
  else{
  return null;}
 }


期间:报了几次错误,解决方法如下:

1
error at ::0 formal unbound in pointcut 

返回值定义参数 配置文件和类方法中不匹配。

有人说是jar包的问题,我试了好像这一步来说,不是jar包的问题


2

严重: Servlet.service() for servlet default threw exception
java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
 at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)

删除cglib-2.1.jar 改用cglib-nodep-2.2.2.jar

Spring2 struts2  hibernate3 后台测试时报的错
 
报错的这句话:Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
 
因为cglib 包和asm包冲突
 
开始用的cglib包是cglib-2.1.3.jar  ,后来换了一个cglib-nodep-2.2.jar才测试通过,不容易,一上午了!!!

3
java.lang.NoSuchMethodException: $Proxy22.login()
动态代理的问题,配置文件里加上 proxy-target-class="true"

  <aop:config>节点中proxy-target-class="true"不为true时。

当登录的时候会报这个异常java.lang.NoSuchMethodException: $Proxy54.login(),

是因为代理Action类的时候,如果Proxy-targer-class=false,默认是用jdk动态代理。

所以代理不了Action类。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值