Struts Chain ClassCastException Aop

网友投稿 606 2022-11-26

Struts Chain ClassCastException Aop

Struts Chain ClassCastException Aop

我们知道struts的restult type 有很多,但主要就是四种 dispatch,rediret,chain,drdirectaction

要让数据从一个action传到另一个action,就只能使用后两种,即chain与redirectaction(后来发现rediret也可以,网上说使用redirect的时候得加上扩展名例如,login.acion等等,可我发现,不加也OK)。

可能是因为,我的过滤器是这么写的

struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*

这俩的区别如下:

先说chain,如果resulttype为chain,如果第一个action(我们暂且称为actionFraom)里面有有个成员变量叫name,而且第二个action(称为actionTo)里面也有个变量叫name,那么第二个action里面的值会复制第一个action。

public class ClassFrom { private String name; private String transFormLocation; public String execute(){ setTransFormLocation("classTo"); System.out.println("i am classfrom"); System.out.println(name+" name"); return "success"; } //省略getset}public class ClassTo { private String name; private String other; public String execute(){ System.out.println("I am classto"); System.out.println(name+" name to"); System.out.println(other+" other to"); return "success"; } //省略getset方法}

如果,actionTo里面有个变量叫other,我想让它也复制actionFrom里name的值,下面这种写法是不行的

classTox ${name} ../result.jsp

上面的情况下,actionto里面的other的值为null

但是actionfrom与actionto里同名的变量name的值是统一的(如果非要在actionto里用other获得值,让它自己找actionto里的name要)

如果使用redirectAction,那么情况刚刚相反,

actionTo里面的other获得了actionFrom里name的值

但是actionTo里面的name却为null

结论

1 基本都用chain吧 能满足你传值的需要(前提是两个action的变量是一致的)

2 如果用redirectaction 就得手动在xml里写param

以上为基础知识

****************************

今天在做项目的时候,发现一个搞不明白的问题。

ClassFrom与ClassTo的execute方法就等于是在一个事务里的。

struts的配置文件如下:

classTox ../../../result.jsp

结果报了下面的错误

java.lang.ClassCastException: cdm.module.file.gxb.action.ClassFrom cannot be cast to cdm.module.file.gxb.action.ClassTo

cdm.module.file.gxb.action.ClassTo$$FastClassByCGLIB$$43d16e6a.invoke()

net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)

org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)

org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)

org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)

org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)

cdm.module.file.gxb.action.ClassTo$$EnhancerByCGLIB$$90aba811.execute()

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

刚开始,我还以为是自己对struts的传值理解的不清楚,就找了些资料,写了本篇博客的前半部分。

可是前面,action不管值能不能传递,最起码不会说ClassCastException呀。

最后仔细分析了错误,发现有aop的问题。

最后把chain改成了redirectAction 就一切OK了。

但是,此时两个action就不在一个事务里了

目前我没有更好的办法

问题就在aop里。

但是这里面更深层次的东西,估计得看源码才能解决了。

结论:

出了bug不要急,仔细看看异常的输出栈

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PageContext ServletContext ServletConfig辨析
下一篇:linux常用命令2
相关文章

 发表评论

暂时没有评论,来抢沙发吧~