0
点赞
收藏
分享

微信扫一扫

Struts Chain ClassCastException Aop

瑾谋 2022-08-18 阅读 126


我们知道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




以上为基础知识


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




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


首先,项目采用的是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 条评论