我正在客户端基于GWT / RequestFactory设置GWT应用程序,在服务器端基于WebLogic设置JPA / EclipseLink。
然而,在开发过程中,每次我在服务器端代码上更改某些内容(它可以是实体,DAO,甚至是Java文件中的注释!),我显然会在{2}之间得到ClassCastException
当我尝试使用我的应用程序时类似的类,并且摆脱它的唯一方法是重新启动我的WebLogic服务器。即使重新部署应用程序也无济于事。
2012年2月10日下午4:08:10 com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost SEVERE:意外错误java.lang.ClassCastException: com.mycompany.MyClass无法强制转换为com.mycompany.MyClass at com.mycompany.server.locator.CodeLevelLocator.getId(MyClassLocator.java:1) 在 com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doGetId(LocatorServiceLayer.java:168) 在 com.google.web.bindery.requestfactory.server.LocatorServiceLayer.getId(LocatorServiceLayer.java:66) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.getId(ServiceLayerDecorator.java:81)
知道如何避免重启服务器吗?
感谢。
编辑:我正在为此设置一个赏金,因为在每次服务器更改后重新启动WebLogic真的很痛苦!!!
感谢James通过添加以下ServletContextListener解决了EDIT2 :
public class DeploymentListener implements ServletContextListener {
private static Logger log = LoggerFactory
.getLogger(DeploymentListener.class.getName());
@Override
public void contextDestroyed(ServletContextEvent arg0) {
try {
// close the Entity Manager Factory.
EMF.close();
} catch (Exception e) {
log.error("Error closing the Entity Manager Factory", e);
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// nothing to do
}
}
答案 0 :(得分:2)
这是一个类加载器问题,不管怎样,在重新部署之后,你的应用程序中仍然存在旧的类/实例。
它可能与JPA有关,您使用的是容器管理的持久性单元,还是应用程序管理的?管理的容器不应该有这个问题,但管理的应用程序可能就像你没有关闭旧的EntityManagerFactory一样,它可以保留旧的类。确保在重新部署之前关闭所有工厂,或者尝试容器管理以确定它是否能解决问题。
答案 1 :(得分:0)
不熟悉在Weblogic上运行GWT,但这可能会有所帮助。
以调试模式运行服务器 - 它应该能够在运行时获取类/ jar更改。
也许您只需要重新发布服务器而不是重新启动它。
最后,您是否在类路径中的其他位置的jar文件中拥有该类?