您的位置:首页 > 编程语言 > Java开发

Struts Chain ClassCastException Aop

2015-10-14 13:58 423 查看
我们知道struts的restult type 有很多,但主要就是四种

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不要急,仔细看看异常的输出栈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: