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

来源:互联网 发布:差分方程matlab编程 编辑:程序博客网 时间:2024/06/05 21:32
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

http://www.2cto.com/kf/201302/190312.html
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