我正在客户端设置一个基于 GWT/RequestFactory 的 GWT 应用程序,并在服务器端设置基于 WebLogic 的 JPA/EclipseLink。
但是,在开发过程中,每当我更改服务器端代码上的某些内容(可以是实体、DAO,甚至 Java 文件中的注释!)时,我都会收到 ClassCastException
当我尝试使用我的应用程序时,在两个明显相似的类之间,摆脱它的唯一方法是重新启动我的 WebLogic 服务器。即使重新部署应用程序也无济于事。
Feb 10, 2012 4:08:10 PM com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost SEVERE: Unexpected error java.lang.ClassCastException: com.mycompany.MyClass cannot be cast to com.mycompany.MyClass at com.mycompany.server.locator.CodeLevelLocator.getId(MyClassLocator.java:1) at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doGetId(LocatorServiceLayer.java:168) at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.getId(LocatorServiceLayer.java:66) at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.getId(ServiceLayerDecorator.java:81)
知道如何避免服务器重新启动吗?
谢谢。
编辑:我正在为此设置赏金,因为每次服务器更改后重新启动 WebLogic 真的很痛苦!!!
EDIT2 通过添加以下 ServletContextListener 解决了 James 的问题:
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
}
}
最佳答案
这是一个类加载器问题,在重新部署后,旧的类/实例仍保留在应用程序中的某个位置。
它可能与 JPA 有关,您使用的是容器管理的持久性单元还是应用程序管理的?容器管理不应该有这个问题,但应用程序管理可能会出现这个问题,就像您不关闭旧的 EntityManagerFactory 一样,它可以保留在旧的类中。确保在重新部署之前关闭所有工厂,或者尝试容器管理以查看是否可以解决问题。
关于gwt - WebLogic 上的 GWT/RequestFactory 的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230092/