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类。