Почему я получаю ClassCastException при доступе к EJB 2.1 в Wildfly 8.2.1?

Я работаю с Java 1.7, XDoclet 1.2.3, WildFly 8.2.1.Final, Dynamic Web Module 2.5, EJB 2.1 в Eclipse Luna.

  • У меня есть проект корпоративного приложения P001_EAR.
  • У меня есть динамический веб-проект под названием P001_WAR.
  • У меня есть проект EJB с именем P001_EJB.
  • У меня есть клиентский проект EJB с именем P001_EJBClient.

В P001_EJB я создаю сеансовый компонент XDoclet без сохранения состояния (EJB 2.1).

Это его удаленный интерфейс:

package com.p001.ejb;

/**
 * Remote interface for Test1SLB.
 * @generated 
 * @wtp generated
 */
public interface Test1SLB extends javax.ejb.EJBObject
{
   /**
    * <!-- begin-xdoclet-definition -->
    * @generated //TODO: Must provide implementation for bean method stub    */
   public java.lang.String foo( java.lang.String param )
      throws java.rmi.RemoteException;    
}

Это его домашний интерфейс:

package com.p001.ejb;

/**
 * Home interface for Test1SLB.
 * @generated 
 * @wtp generated
 */
public interface Test1SLBHome extends javax.ejb.EJBHome
{
   public static final String COMP_NAME="java:comp/env/ejb/Test1SLB";
   public static final String JNDI_NAME="Test1SLB";

   public com.p001.ejb.Test1SLB create()
      throws javax.ejb.CreateException,java.rmi.RemoteException;
}

В P001_WAR я создал класс слушателя с именем P001Listener; В его contextInitialized методе я пытаюсь вызвать foo метод Test1SLB EJB. Это его код:

public class P001Listener implements ServletContextListener {

    public P001Listener() {
    }

    public void contextInitialized(ServletContextEvent sce)  { 
         System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): inside");
         String test1SLBJNDIName = null;
         Class test1SLBHomeClass = null;
         InitialContext initialContext = null;
         Object namedObject = null;
         Object ejbHomeObject = null;
         Test1SLBHome test1SLBHome = null;
         Test1SLB test1SLB = null;
         String rtnValue = null;


         try {

            test1SLBJNDIName = "java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLB";
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): test1SLBJNDIName=" + test1SLBJNDIName);

            test1SLBHomeClass = Test1SLBHome.class;
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): test1SLBHomeClass=" + test1SLBHomeClass);

            initialContext = new InitialContext();
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): initialContext=" + initialContext);

            namedObject = initialContext.lookup(test1SLBJNDIName);
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): namedObject=" + namedObject);

            ejbHomeObject = PortableRemoteObject.narrow(namedObject, test1SLBHomeClass);
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): ejbHomeObject=" + ejbHomeObject);

            test1SLBHome = (Test1SLBHome) ejbHomeObject;
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): test1SLBHome=" + test1SLBHome);

            test1SLB = test1SLBHome.create();
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): test1SLB=" + test1SLB);

            rtnValue = test1SLB.foo("pagal");
            System.out.println("P001Listener.java: contextInitialized(ServletContextEvent sce): rtnValue=" + rtnValue);

        } catch (NamingException ne) {
            ne.printStackTrace();

        } catch (ClassCastException cce) {
            cce.printStackTrace();

        } catch (RemoteException re) {
            re.printStackTrace();

        } catch (CreateException ce) {
            ce.printStackTrace();

        }
    }

    public void contextDestroyed(ServletContextEvent sce)  { 
        System.out.println("P001Listener.java: contextDestroyed(ServletContextEvent sce): inside");
    }

}

Я развертываю P001_EAR на WildFly. Вот как выглядит развёртывание:

P001_EAR.ear

Внутри P001_EAR.ear у меня есть:

  • МЕТА-ИНФ
  • P001_EJB.jar
  • P001_WAR.war
  • P001_EJBClient.jar

Внутри META-INF у меня есть:

  • application.xml

Внутри P001_EJB.jar у меня есть:

  • МЕТА-ИНФ \ ejb-jar.xml
  • МЕТА-ИНФ \ jboss.xml
  • МЕТА-ИНФ \ МАНИФЕСТ.MF
  • com \ p001 \ ejb \ Test1SLBBean.class
  • com \ p001 \ ejb \ Test1SLBSession.class

Внутри P001_WAR.war у меня есть:

  • МЕТА-ИНФ \ МАНИФЕСТ.MF
  • WEB-INF \ web.xml
  • WEB-INF \ классы \ com \ p001 \ listener \ P001Listener.class
  • WEB-INF \ lib

Внутри P001_EJBClient.jar у меня есть:

  • МЕТА-ИНФ \ МАНИФЕСТ.MF
  • com \ p001 \ ejb \ Test1SLB.class
  • com \ p001 \ ejb \ Test1SLBHome.class
  • com \ p001 \ ejb \ Test1SLBLocal.class
  • com \ p001 \ ejb \ Test1SLBLocalHome.class
  • com \ p001 \ ejb \ Test1SLBUtil.class

Я запустил WildFly. В файле server.log я вижу, что EJB успешно развернут:

2015-12-08 11: 21: 58,671 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (служебный поток MSC 1-3) Привязки JNDI для сеансового компонента с именем Test1SLB в подразвертывании модуля развертывания «P001_EJB.jar» развертывания "P001_EAR.ear" следующие:

java: global / P001_EAR / P001_EJB / Test1SLB! com.p001.ejb.Test1SLBHome java: app / P001_EJB / Test1SLB! com.p001.ejb.Test1SLBHome java: модуль / Test1SLB! /P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLBHome java: global / P001_EAR / P001_EJB / Test1SLB! Com.p001.ejb.Test1SLBLocalHome java: app / P001_EJBLocalHome java: app / P001_EJB / P001_EJBLocalHome java: app / P001_EJB_Java: app / P001_EJB_Java: приложение / P001_EJB_Java: приложение / P001_EJB_Java: приложение / P001_EJB_E_Java: Test1SLB! Com.p001.ejb.Test1SLBLocalHome java: global / P001_EAR / P001_EJB / Test1SLB! Com.p001.ejb.Test1SLB java: app / P001_EJB / Test1SLB! Com.p001.ejb.test1sLB! Com.p001.ejb.Test1. .ejb.Test1SLB java: jboss / exported / P001_EAR / P001_EJB / Test1SLB! com.p001.ejb.Test1SLB java: global / P001_EAR / P001_EJB / Test1SLB! com.p001.ejb.JBLB! com.p001.ejb.JBLB! p001.ejb.Test1SLBLocal java: модуль / Test1SLB! com.p001.ejb.Test1SLBLocal

Но я получаю java.lang.ClassCastException в этой строке:

ejbHomeObject = PortableRemoteObject.narrow(namedObject, test1SLBHomeClass);

Это server.log:

2015-12-08 11: 21: 59,158 ИНФОРМАЦИЯ [stdout] (служебный поток MSC 1-9) P001Listener.java: contextInitialized (ServletContextEvent sce): внутри

2015-12-08 11:21: 59,159 ИНФОРМАЦИЯ [stdout] (служебный поток MSC 1-9) P001Listener.java: contextInitialized (ServletContextEvent sce): test1SLBJNDIName = java: global / P001_EAR / P001_EJB / Test1SLB! Com.p001.ejb. Test1SLB

2015-12-08 11:21: 59,161 INFO [stdout] (служебный поток MSC 1-9) P001Listener.java: contextInitialized (ServletContextEvent sce): test1SLBHomeClass = interface com.p001.ejb.Test1SLBHome

2015-12-08 11:21: 59,164 INFO [stdout] (служебный поток MSC 1-9) P001Listener.java: contextInitialized (ServletContextEvent sce): initialContext=javax.naming.InitialContext@2db02a6a

2015-12-08 11:21: 59,171 INFO [org.jboss.ejb.client] (служебный поток MSC 1–9) JBoss EJB Client, версия 2.0.1.Final 2015-12-08 11:21: 59,177 INFO [stdout ] (Служебный поток MSC 1-9) P001Listener.java: contextInitialized (ServletContextEvent sce): namedObject = Прокси для удаленного EJB StatelessEJBLocator {appName = 'P001_EAR', moduleName = 'P001_EJB', independentName = '', beanName = 'Test view = 'interface com.p001.ejb.Test1SLB'}

2015-12-08 11: 21: 59,197 ОШИБКА [stderr] (служебный поток MSC 1–9) java.lang.ClassCastException

2015-12-08 11: 21: 59,198 ОШИБКА [stderr] (служебный поток MSC 1–9) на org.jboss.com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow (PortableRemoteObject.java:246 )

2015-12-08 11: 21: 59,200 ОШИБКА [stderr] (служебный поток MSC 1–9) в javax.rmi.PortableRemoteObject.narrow (PortableRemoteObject.java:158)

2015-12-08 11: 21: 59,201 ОШИБКА [stderr] (служебный поток MSC 1–9) в com.p001.listener.P001Listener.contextInitialized (P001Listener.java:59)

2015-12-08 11: 21: 59,202 ОШИБКА [stderr] (служебный поток MSC 1–9) в io.undertow.servlet.core.ApplicationListeners.contextInitialized (ApplicationListeners.java:173)

2015-12-08 11: 21: 59,204 ОШИБКА [stderr] (служебный поток MSC 1–9) в io.undertow.servlet.core.DeploymentManagerImpl.deploy (DeploymentManagerImpl.java:194)

2015-12-08 11: 21: 59,206 ОШИБКА [stderr] (поток службы MSC 1–9) в org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext (UndertowDeploymentService.java:87)

2015-12-08 11: 21: 59,208 ОШИБКА [stderr] (служебный поток MSC 1–9) в org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start (UndertowDeploymentService.java:72)

2015-12-08 11:21: 59,210 ОШИБКА [stderr] (служебный поток MSC 1–9) в org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService (ServiceControllerImpl.java:1948)

2015-12-08 11: 21: 59,211 ОШИБКА [stderr] (служебный поток MSC 1–9) в org.jboss.msc.service.ServiceControllerImpl $ StartTask.run (ServiceControllerImpl.java:1881)

2015-12-08 11:21: 59,212 ОШИБКА [stderr] (служебный поток MSC 1–9) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)

2015-12-08 11:21: 59,214 ОШИБКА [stderr] (служебный поток MSC 1–9) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615)

2015-12-08 11: 21: 59,215 ОШИБКА [stderr] (служебный поток MSC 1–9) в java.lang.Thread.run (Thread.java:745)

2015-12-08 11: 21: 59,216 ОШИБКА [stderr] (служебный поток MSC 1–9) Причина: java.lang.ClassCastException: com.sun.proxy. $ Proxy21 не может быть преобразован в org.omg.CORBA.Object

2015-12-08 11:21: 59,218 ОШИБКА [stderr] (служебный поток MSC 1–9) на org.jboss.com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow (PortableRemoteObject.java:225 )

2015-12-08 11: 21: 59,219 ERROR [stderr] (MSC service thread 1-9) ... Еще 11

Что я делаю не так, чтобы получить это сообщение об ошибке?

Спасибо

ОБНОВИТЬ

Я нашел решение. Когда я меняю этот код:

test1SLBJNDIName = "java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLB";

к этому коду:

test1SLBJNDIName = "java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLBHome";

тогда это сработало. Итак, в основном я сейчас ищу JNDI Name of Home, а затем передаю его домашнему классу.

В старом JBoss 4.2.X я ищу имя JNDI Test1SLB, а затем передаю его домашнему классу, и это сработало. Так было ли в старом JBoss 4.2.X использовать одно имя JNDI Test1SLB для Remote и Home?


person ChumboChappati    schedule 08.12.2015    source источник
comment
Как выглядит ваше развертывание? какие баночки есть в lib?   -  person Tomaz Cerar    schedule 08.12.2015
comment
@ctomc только что обновил вопрос, включив в него сведения о развертывании. Взгляни, пожалуйста.   -  person ChumboChappati    schedule 08.12.2015
comment
Одно замечание: почему вы используете EJB 2.1, в то время как можете использовать EJB 3.2, который является частью Java EE 7?   -  person Rémi Bantos    schedule 08.12.2015
comment
@ Rémi Я тестирую EJB 2.x на WildFly 8.x, так как в настоящее время мы используем EJB 2.x на JBoss 4.x, и мы рассматриваем возможность обновления до WildFly 8.x, но по-прежнему остаемся на EJB 2.x (для некоторых неизвестных причины)   -  person ChumboChappati    schedule 09.12.2015
comment
Можете ли вы дважды проверить, что WEB-INF / lib вашей WAR пуст?   -  person jpkrohling    schedule 09.12.2015
comment
@jpkrohling WEB-INF / lib WAR пуста   -  person ChumboChappati    schedule 09.12.2015


Ответы (1)


Я нашел решение. Когда я меняю этот код:

test1SLBJNDIName = "java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLB";

к этому коду:

test1SLBJNDIName = "java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLBHome";

тогда это сработало. Так что в основном я сейчас ищу Home, а затем переключаю на Home Class.

В старом JBoss 4.2.X я ищу имя JNDI Test1SLB, а затем передаю его домашнему классу, и это сработало. Таким образом, в старом JBoss 4.2.X было 1 имя JNDI Test1SLB, используемое как для Remote, так и для Home.

person ChumboChappati    schedule 15.12.2015