【问题标题】:Class cast exception in Ejb lookupEjb 查找中的类转换异常
【发布时间】:2014-12-08 16:18:25
【问题描述】:

我有一个带有战争 ejb 和耳朵的简单多模块 maven 项目

当我尝试使用查找从 java pojo 类访问我的 ejb 时,它给了我 Wildfly 上的类转换异常,它在 jboss 7 上完美运行..

我已经检查了与这篇文章相关的几乎所有链接,如果有人知道如何解决这个问题,请提供帮助。这是我的示例代码:

我的ejb界面:

package interfacejar;

import javax.ejb.Local;


public interface HelloWorldRemote {
       public String sayHello();       
       public void helloWait() ;  
}

会话 Bean

@Stateless
public class HelloWorld implements Serializable, HelloWorldRemote {

    public String sayHello() {
        // TODO Auto-generated method stub
        return "hello";
    }

    public void helloWait(){
        // TODO Auto-generated method stub
    System.out.println("in ejb");   
    }



}  

我的战争界面: //因为我正在从我的maven项目的不同模块中的pojo类访问ejb,所以它也需要在这个模块中创建接口

package interfacejar;

public interface HelloWorldRemote {
       public String sayHello();  

       public void helloWait() throws Exception;  
}

我的 Java 类

public class Testnew{




    public HelloWorldRemote getProps(){
        HelloWorldRemote ref=null;
         try {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial","org.jboss.as.naming.InitialContextFactory");
        props.setProperty("java.naming.provider.url", "localhost");
        props.setProperty("jboss.naming.client.ejb.context", "true");
        props.setProperty("java.naming.factory.url.pkgs", "org.jboss.ejb.client.naming");



            Context context = new InitialContext(props);

            Object obj =    context.lookup("java:global/MyEarFile/testejb-0.0.1-SNAPSHOT/HelloWorld!interfacejar.HelloWorldRemote");

             ref=(HelloWorldRemote) obj;

        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         return ref;

    }




        public void getRemote(){
            HelloWorldRemote ref=null;
            try {
                ref=getProps();

                ref.helloWait();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            }

}

调用这个类的Servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub

    this.processRequest(request, response);

}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    this.processRequest(request, response);
}
//java:global/MyEarFile/testejb-0.0.1-SNAPSHOT/HelloWorld!interfacejar.HelloWorldRemote*
/*@Resource(mappedName = "java:global/MyEarFile/tstwar-0.0.1-SNAPSHOT/HelloWorld!interfacejar.HelloWorldRemote")
private HelloWorldRemote helloWorldRemote;*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("in servlet");

    Testnew testnew = new Testnew();
    testnew.getRemote();


}

这是我遇到的错误

21:06:49,205 ERROR [stderr] (default task-3) java.lang.ClassCastException: interfacejar.HelloWorldRemote$$$view4 cannot be cast to interfacejar.HelloWorldRemote

21:06:49,205 ERROR [stderr] (default task-3)    at com.test.Testnew.getProps(Testnew.java:43)

21:06:49,205 ERROR [stderr] (default task-3)    at com.test.Testnew.getRemote(Testnew.java:59)

【问题讨论】:

    标签: java maven jakarta-ee ejb wildfly-8


    【解决方案1】:

    当我从 pojo 类访问 ejb 时,该类位于我的 maven 项目的不同模块中,因此它也需要在此模块中创建接口

    这是一个错误,老实说,我不知道它对您在 JBoss 上的作用如何。您不能只创建一个类并将其强制转换,您需要将该模块与会话 bean 作为依赖项添加到您的 war 模块。

    两个类,除了相同的包和名称,需要使用相同的类加载器加载才能被视为同一个类。

    【讨论】:

    • 我在战争中添加了ejb的依赖
    • 你仍然得到 ClassCastException?您是否删除了本地 HelloWorldRemote 类?
    • 是的,我确实从战争中删除了该类,并在战争中添加了 ejb 的依赖项,但它仍然给出异常,我不知道为什么
    【解决方案2】:

    您似乎没有注释您的界面、@Local@Remote。你可以注释你的界面

    @Remote
    public interface HelloWorldRemote ...
    

    或者一颗豆子

    @Remote(HelloWorldRemote.class)
    @Stateless
    public class HelloWorld implements HelloWorldRemote ...
    

    【讨论】:

      【解决方案3】:

      我找到了解决办法

      当我将查找从 ejb 更改为 war 时,它确实有效

      Context context = new InitialContext(props);
      
              Object obj =    context.lookup("java:global/MyEarFile/AllWar-0.0.1-SNAPSHOT/HelloWorld!interfacejar.HelloWorldRemote");
      
               ref=(HelloWorldRemote) obj;
      

      给出正在进行查找的战争的名称解决了我的问题......希望它也能帮助其他人

      【讨论】:

        猜你喜欢
        • 2014-03-13
        • 1970-01-01
        • 2011-06-23
        • 2011-10-12
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多