Wildfly 8.2.1에서 EJB 2.1에 액세스할 때 ClassCastException이 발생하는 이유는 무엇입니까? (Why I am getting ClassCastException when accessing EJB 2.1 in Wildfly 8.2.1?)


문제 설명

Wildfly 8.2.1에서 EJB 2.1에 액세스할 때 ClassCastException이 발생하는 이유는 무엇입니까? (Why I am getting ClassCastException when accessing EJB 2.1 in Wildfly 8.2.1?)

Eclipse Luna에서 Java 1.7, XDoclet 1.2.3, WildFly 8.2.1.Final, Dynamic Web Module 2.5, EJB 2.1로 작업하고 있습니다.

  • 다음과 같은 엔터프라이즈 애플리케이션 프로젝트가 있습니다. P001_EAR.
  • 이름이 P001_WAR인 동적 웹 프로젝트가 있습니다.
  • 이름이 P001_EJB<인 EJB 프로젝트가 있습니다. /strong>.
  • P001_EJBClient라는 EJB 클라이언트 프로젝트가 있습니다.

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라는 Listener 클래스를 만들었습니다. contextInitialized 메소드에서 Test1SLB EJB의 foo 메소드를 호출하려고 합니다. 코드는 다음과 같습니다.

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");
    }

}

WildFly에 P001_EAR을 배포합니다. 배포 모습은 다음과 같습니다.

P001_EAR.ear

P001_EAR.ear 내부

em> 가지고 있습니다:

  • META‑INF
  • P001_EJB.jar
  • P001_WAR.war
  • P001_EJBClient .jar

META‑INF 내부:

  • application.xml

/li>

  • 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) 배포 "P001_EAR.ear"의 배포 단위 하위 배포 "P001_EJB.jar"에서 Test1SLB라는 세션 Bean에 대한 JNDI 바인딩은 다음과 같습니다.

    java:global/P001_EAR/P001_EJB/Test1SLB!com.p001.ejb.Test1SLB홈 java:app/P001_EJB/Test1SLB!com.p001.ejb.Test1SLB홈 이 오류 메시지를 받기 위해 내가 무엇을 잘못하고 있습니까?

    감사합니다

    업데이트

    해결책을 찾았습니다. 이 코드를 변경하면:

    ejbHomeObject = PortableRemoteObject.narrow(namedObject, test1SLBHomeClass);
    

    이 코드로:

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

    작동했습니다. 그래서 기본적으로 JNDI Name of Home을 찾은 다음 Home Class로 캐스팅하고 있습니다.

    이전 JBoss 4.2.X에서는 JNDI 이름 Test1SLB를 찾은 다음 이를 Home Class로 캐스트하고 작동했습니다. 그렇다면 이전 JBoss 4.2.X에서 Remote와 Home 모두에 사용된 1개의 JNDI 이름 Test1SLB가 있었습니까?

    그런 다음 작동했습니다. 그래서 기본적으로 JNDI Name of Home을 찾은 다음 Home Class로 캐스팅하고 있습니다.

    이전 JBoss 4.2.X에서는 JNDI 이름 Test1SLB를 찾은 다음 이를 Home Class로 캐스트하고 작동했습니다. 그렇다면 이전 JBoss 4.2.X에서 Remote와 Home 모두에 사용된 1개의 JNDI 이름 Test1SLB가 있었습니까?

    그런 다음 작동했습니다. 그래서 기본적으로 JNDI Name of Home을 찾은 다음 Home Class로 캐스팅하고 있습니다.

    이전 JBoss 4.2.X에서는 JNDI 이름 Test1SLB를 찾은 다음 이를 Home Class로 캐스트하고 작동했습니다. 그렇다면 이전 JBoss 4.2.X에서 Remote와 Home 모두에 사용된 1개의 JNDI 이름 Test1SLB가 있었습니까?


    참조 솔루션

    방법 1:

    I have found a solution. When I change this code:

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

    to this code:

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

    then it worked. So basically I am now looking up Home and then casting it to Home Class.

    In the old JBoss 4.2.X, I look up the JNDI Name Test1SLB and then cast it to Home Class and it worked. So there was 1 JNDI Name Test1SLB used for both Remote and Home in the old JBoss 4.2.X.

    (by ChumboChappatiChumboChappati)

    참조 문서

    1. Why I am getting ClassCastException when accessing EJB 2.1 in Wildfly 8.2.1? (CC BY‑SA 2.5/3.0/4.0)

    #jakarta-ee #ejb-2.x #wildfly #eclipse #java






    관련 질문

    주입을 통해 JBoss AS의 다른 WAR에서 EJB에 액세스 (Access EJB from different WAR in JBoss AS via injection)

    데이터베이스 필드를 매일 확인하려면 어떻게 해야 합니까? 크론 작업? (How can I check database field every day?Cron job?)

    Java ee netbeans에서 javadocs를 첨부하는 방법 (How to attach javadocs in java ee netbeans)

    날짜 차이 제한 최대 절전 모드 (Date difference in days Restriction Hibernate)

    Wildfly 8.2.1에서 EJB 2.1에 액세스할 때 ClassCastException이 발생하는 이유는 무엇입니까? (Why I am getting ClassCastException when accessing EJB 2.1 in Wildfly 8.2.1?)

    WebLogic Application Server(10.3.6)가 큰 크기의 이어 파일 배포, 중요한 CSRF로 실패함 (WebLogic Application Server (10.3.6) fails with Large sized ear file deployment, critical CSRF)

    개체 배열을 설정하는 동안 FindBug 오류 '변경 가능한 개체에 대한 참조를 통합하여 내부 표현을 노출할 수 있음'을 수정하는 방법은 무엇입니까? (How to Fix FindBug error 'May expose internal representation by incorporating reference to mutable object' while setting Array of Objects?)

    Stateless EJB가 역직렬화될 때 @Resource 주석이 적용됩니까? (Is the @Resource annotation applied when a Stateless EJB is deserialized?)

    Eclipse 및 웹 프로젝트 가져오기, 서버에서 실행 누락! (Eclipse and Web Project import, run on Server missing!)

    Spring 다중 모듈 프로젝트를 설정하는 방법은 무엇입니까? (How to setup a Spring multimodule project?)

    JBoss 5.1의 Java EE 빈에서 빈 EntityManager (Empty EntityManager in Java EE bean on JBoss 5.1)

    사용자가 찾을 수 없는 페이지를 요청했는지 감지하는 필터를 만드는 방법은 무엇입니까? (How to make a filter to detect if the user requested a page that is not found?)







    코멘트