2012-02-10 2 views
2

Я настраиваю приложение GWT на основе GWT/RequestFactory на стороне клиента и JPA/EclipseLink поверх WebLogic на стороне сервера.ClassCastException с GWT/RequestFactory на WebLogic

Однако во время разработки каждый раз, когда я что-то меняю на серверном коде (это может быть сущность, DAO или даже комментарий в файле Java!), Я получаю ClassCastException между двумя, по-видимому, аналогичными классами, когда Я пытаюсь использовать свое приложение, и единственный способ избавиться от него - это перезагрузить мой сервер WebLogic. Даже повторное развертывание приложения не помогает.

10 февраля 2012 4:08:10 PM 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)

Любая идея, как избежать этого рестарт сервера?

Спасибо.

EDIT: Я создаю щедрость на этом, потому что перезапуск WebLogic после каждого изменения сервера очень болезнен!

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 
    } 

} 
+2

Я не очень квалифицирован, чтобы отвечать, но я могу предложить следующее: Ошибка выглядит как проблема загрузчика классов, где jvm, по-видимому, имеет два разных объявления для одного и того же класса из двух загрузчиков классов и поэтому считает их разными классами , В большинстве контейнеров сервлетов используется специализированный загрузчик классов, чтобы изолировать приложения друг от друга и разрешать развертывание приложений - я думаю, что это не работает правильно в вашем случае. –

+0

Спасибо за подсказку, но здесь я считаю, что здесь есть что-то конкретное [GWT/RequestFactory] (http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html). Может быть, любой пользователь GWT здесь столкнулся с этой проблемой? – foch

+0

Я на самом деле разработчик GWT и использую RF в большинстве своих проектов, но я достаточно точно знаю о проблемах загрузчика классов, чтобы предложить это предложение. Я никогда не видел эту проблему при перераспределении классов RF на Jetty или Tomcat. –

ответ

2

Это проблема загрузчика классов, так как после перераспределения у вас есть старые классы/экземпляры, оставшиеся где-то в вашем приложении.

Это может быть связано с JPA, вы используете управляемый контейнером блок персистентности или управляемое приложение? У контейнера не должно быть этой проблемы, но управление приложениями могло бы, как если бы вы не закрыли старый EntityManagerFactory, он может остаться со старыми классами. Убедитесь, что вы закроете все заводы перед повторным развертыванием или попробуйте контейнер, чтобы проверить, устраняет ли проблема.

+0

Фантастический, он работает! Я использую упорство на управлении приложениями, поэтому я добавил слушателя, чтобы закрыть мой завод. Это было потрачено 50 повторений, спасибо :) – foch

0

Не знакомы с запуском GWT на Weblogic, но, возможно, это поможет.

Запустите свой сервер в режиме отладки - он должен иметь возможность выбирать изменения класса/баннера во время выполнения.

Возможно, вам нужно только повторно опубликовать свой сервер вместо перезапуска.

Наконец, у вас есть этот класс в файле jar в другом месте вашего пути к вашему классу?

Смежные вопросы