Struts Chain ClassCastException Aop
来源:互联网 发布:中国青少年犯罪的数据 编辑:程序博客网 时间:2024/05/20 22:01
我们知道struts的restult type 有很多,但主要就是四种
dispatch,rediret,chain,drdirectaction
这俩的区别如下:
先说chain,如果resulttype为chain,如果第一个action(我们暂且称为actionFraom)里面有有个成员变量叫name,而且第二个action(称为actionTo)里面也有个变量叫name,那么第二个action里面的值会复制第一个action。
如果,actionTo里面有个变量叫other,我想让它也复制actionFrom里name的值,下面这种写法是不行的
上面的情况下,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
****************************
今天在做项目的时候,发现一个搞不明白的问题。
首先,项目采用的是ssh,事务我采用的是xml的声明式事务管理。
ClassFrom与ClassTo的execute方法就等于是在一个事务里的。
struts的配置文件如下:
结果报了下面的错误
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的问题。
dispatch,rediret,chain,drdirectaction
要让数据从一个action传到另一个action,就只能使用后两种,即chain与redirectaction(后来发现rediret也可以,网上说使用redirect的时候得加上扩展名例如,login.acion等等,可我发现,不加也OK)。
可能是因为,我的过滤器是这么写的
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这俩的区别如下:
先说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的值,下面这种写法是不行的
<package name="sdf" namespace="/modules" extends="struts-default"> <action name="classFrom" class="com.bufoon.action.ActionFrom" > <result name="success" type="chain"> <param name="actionName">classTox</param> <param name="other">${name}</param> </result> </action> <action name="classTox" class="com.bufoon.action.ActionTo" > <result>../result.jsp</result> </action> </package>
上面的情况下,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
更多资料见
http://blog.csdn.net/yujielu2012/article/details/8188383
****************************
今天在做项目的时候,发现一个搞不明白的问题。
首先,项目采用的是ssh,事务我采用的是xml的声明式事务管理。
ClassFrom与ClassTo的execute方法就等于是在一个事务里的。
struts的配置文件如下:
<package name="sdf" namespace="/modules/file_gxb/createFile" extends="struts-default"> <action name="classFrom" class="cdm.module.file.gxb.action.ClassFrom" > <result type="chain">classTox</result> </action> <action name="classTox" class="cdm.module.file.gxb.action.ClassTo" > <result>../../../result.jsp</result> </action></package>
结果报了下面的错误
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不要急,仔细看看异常的输出栈
0 0
- Struts Chain ClassCastException Aop
- struts 2中的chain
- struts 2中的chain
- SAIF:Struts的AOP
- ClassCastException
- ClassCastException
- ClassCastException
- ClassCastException
- ClassCastException
- Struts中type="chain"的用法!
- 一个神奇Spring AOP的java.lang.ClassCastException问题
- 解决:ClassCastException when testcase is using Spring AOP proxied
- java.lang.ClassCastException: org.apache.struts.taglib.bean.CookieTei
- java.lang.ClassCastException: org.apache.struts.action.ActionMessage 错误
- java.lang.ClassCastException: org.apache.struts.taglib.html.*Tei
- java.lang.ClassCastException: org.apache.struts.taglib.bean.CookieTei
- java.lang.ClassCastException: org.apache.struts.action.RequestProcessor解决方法!
- Spring-AOP-Struts重新解析
- Linux下为Tomcat指定JDK
- Android 给Button加圆角
- android日记 2015-10-14
- Visual Studio 2012 智能提示功能消失解决办法
- javax.net.ssl.SSLKeyException: RSA premaster secret error错误的解决办法
- Struts Chain ClassCastException Aop
- escape()、encodeURI()、encodeURIComponent()区别详解
- RSA in JavaScript v2 – now with padding!
- Spring自动扫描和装配bean
- 2015年云计算和大数据两场技术分享会
- 字符编码笔记:ASCII,Unicode和UTF-8
- ActiveAdmin 自定义列表页
- 如何做好现阶段的网站排名?
- Java中匿名类的两种实现方式