EDIT: я внес изменения, так как думаю, что в моем вопросе могут отсутствовать некоторые технические детали.
Проблема возникает в Struts 1.3.x и описывается следующим образом:
При изменении классов, связанных со Struts (например, ActionForm, Action и/или любого класса, который я использую с ними), я получаю ClassCastException при тестировании своих изменений (без перезапуска моего веб-приложения).
Если я перезапущу свое веб-приложение после внесения тех же изменений, то исключений не будет, и сделанные изменения будут видны при тестировании.
Такое поведение считается НОРМАЛЬНЫМ по следующим причинам:
Мой веб-контейнер (weblogic) настроен на перезагрузку сервлета и классов при внесении изменений
Я предполагаю, что при изменении моих классов используется другой ClassLoader. Что может вызвать ClassCastException.
Поэтому мне приходится перезапускать веб-приложение каждый раз, когда я хочу протестировать исходные модификации...
Что я хочу знать, так это то, что я могу сделать (шаблон программирования? передовой опыт?), чтобы избежать такого рода ClassCastException или избежать перезапуска веб-приложения для просмотра моих изменений?
Вот трассировка стека:
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).
Я продолжу проводить параллельные тесты, чтобы немного больше понять об этом исключении...