【发布时间】:2012-02-10 15:24:35
【问题描述】:
我正在客户端设置基于 GWT/RequestFactory 的 GWT 应用程序,并在服务器端设置基于 WebLogic 的 JPA/EclipseLink。
但是,在开发过程中,每次我更改服务器端代码(它可以是实体、DAO,甚至是 Java 文件中的注释!)时,我都会在两个明显相似的类之间得到一个 ClassCastException当我尝试使用我的应用程序时,摆脱它的唯一方法是重新启动我的 WebLogic 服务器。即使重新部署应用程序也无济于事。
2012 年 2 月 10 日下午 4:08:10 com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost 严重:意外错误 java.lang.ClassCastException: com.mycompany.MyClass 无法在以下位置转换为 com.mycompany.MyClass 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 真的很痛苦!!!
EDIT2 感谢 James 通过添加以下 ServletContextListener 来解决:
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
}
}
【问题讨论】:
-
我真的没有资格回答,但我可以建议:错误看起来像一个类加载器问题,jvm 显然有来自两个类加载器的同一个类的两个不同声明,因此认为他们是不同的班级。大多数 servlet 容器使用专门的类加载器来保持应用程序彼此隔离,并允许重新部署应用程序 - 我猜这在您的情况下无法正常工作。
-
感谢您的提示,但我相信这里有一些特定于 GWT/RequestFactory 的内容。也许这里的任何 GWT 用户都遇到过这个问题?
-
我实际上首先是一名 GWT 开发人员,并且在我的大多数项目中都使用 RF,但我知道的类加载器问题足以提供该建议。在将 RF 类重新部署到 Jetty 或 Tomcat 时,我从未见过这个问题。
-
好的,谢谢!我想最简单的解决方案是在 Jetty 下进行开发并仅保留 WebLogic 用于生产,在代码加载后重新启动服务器不是一个大问题!
标签: gwt jpa weblogic eclipselink requestfactory