编辑:我所做的更改,因为我觉得我的问题可能会丢失一些技术细节如何避免Struts 1.3.x中ClassCastException由于其类加载策略?
Struts中1.3.x中出现该问题,并通过了以下描述:
当修改相关类Struts(例如ActionForm,Action和/或任何我使用它们的类),那么当我测试我的修改时(而不重新启动我的webapp),我会得到ClassCastException。
如果在进行相同的修改后重新启动我的web应用程序,则没有例外,并且在进行测试时可以看到所做的更改。
这种行为被认为是因为以下原因是正常的:
我的Web容器(weblogic的)被配置为重新加载servlet和类如作改动
我认为不同的ClassLoader在对我的类进行修改时使用。这可能导致ClassCastException。
因此我必须重新启动web应用程序,每次我想测试我的源代码修改...
我想知道的是我能做些什么(编程模式?最佳实践?),以避免这种ClassCastException或避免重新启动webapp来查看我的更改?
这里是堆栈跟踪:
java.lang.ClassCastException: my.package.here.MyActionClassNameHere
at org.apache.struts.chain.commands.servlet.CreateAction.getAction(CreateAction.java:65)
at org.apache.struts.chain.commands.AbstractCreateAction.execute(AbstractCreateAction.java:91)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1914)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:463)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:821)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
我见过JRebel的有关页面。这可能是一个解决方案,但我没有准备好将其用于我的目的(这是一些使用struts 1.3.x的非常简单的测试)。
我会继续做一些并行测试,了解多一点有关此异常...
我只听说过有关JRebel的好东西,但我从来没有用过它(而且它不是免费的) – 2012-07-20 15:45:42
@JBNizet:Merci pour taréponse^^ (Je ne suis pas s je tes testerai JRebel juste pour mes petits tests ...) – user1199680 2012-07-23 09:43:43
JB Nizet,如果你在那里开源开发也可以免费使用它也可以使用社交计划,它将很快推出=)https:// my.jrebel.com/plans – 2012-07-25 06:56:57