編集:質問に技術的な詳細が欠けている可能性があるため、変更を加えました
この問題は Struts 1.3.x で発生し、次のように説明されています。
Struts に関連するクラス (たとえば、ActionForm、Action、および/またはそれらで使用するクラス) を変更すると、変更をテストすると ( webapp を再起動せずに) ClassCastException が発生します。
同じ変更を行った後に webapp を再起動すると、例外はなく、テスト時に変更が表示されます。
この動作は、次の理由から正常であると言われています。
私の Web コンテナー (weblogic) は、変更が加えられた場合にサーブレットとクラスをリロードするように構成されています
クラスに変更が加えられると、別の ClassLoader が使用されると思います。これにより、ClassCastException が発生する可能性があります。
したがって、ソースの変更をテストするたびに webapp を再起動する必要があります...
私が知りたいのは、この種の 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 を使用した非常に単純なテストです)。
この例外についてもう少し理解するために、いくつかの並行テストを続けます...