簡體   English   中英

為什么我不能通過JNDI使用遠程接口訪問EJB?

[英]Why can't I access my EJB using the remote interface through JNDI?

我在使用JNDI檢索bean時遇到問題。

我有兩只耳朵:clientear和workerear。 Clientear包含clientejb和libejb Workerear包含workerejb和libejb

lib包含MyInterface。workerejb包含bean和抽象類,clientejb包含執行查找的客戶端代碼。

我的bean實現了一個遠程接口

public class MyBean implements MyInterface

它的JNDI綁定是

java:global/jndinaming/MyBean!learning.jndinaming.MyInterface

那沒問題。

現在,我希望它擴展一個Abstract類:

public abstract  class MyAbstractClass implements MyInterface
public class MyBean extends MyAbstractClass

因此,JNDI綁定變為

java:global/jndinaming/MyBean!learning.jndinaming.MyBean

沒關系,我調整了字符串和代碼,如下所示:

(MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyInterface");

變成這個:

(MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyBean");

而且我得到一個Class Cast異常:

ClassCastException:無法將MyBean $$$ view68(id = 938)強制轉換為MyInterface

接口文件在一個項目中,客戶端項目和工作程序項目都可以訪問該文件。

客戶端項目包含調用lookup方法的代碼。

worker項目具有bean實現和抽象類。

這些項目位於單獨的Ear文件中,但位於同一wildfly容器中。

為什么在抽象類中添加新的“圖層”會導致此類強制轉換異常? 我該怎么解決?

順便說一句:嘗試使用訪問

 (MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyInterface");

結果會拋出一個nameNotFound異常

編輯:這是bean,Abstract類和接口的當前狀態:

接口:

import javax.ejb.Remote;

@Remote
public interface MyInterface {
    public void print();

}

抽象類:

public abstract  class MyAbstractClass implements MyInterface{

}

豆豆

@Stateless
public class MyBean extends MyAbstractClass{

    @Override
    public void print() {
        System.out.println("MyAbstractClassExtender.PRINT");

    }

}

客戶代碼:

@Stateless
public class TimedBean {
    @Resource
    private SessionContext              ctx;

    @Schedule(second="*/10", minute="*", hour="*")
    public void run() throws NamingException{
            MyInterface c2 = (MyInterface) ctx.lookup("java:global/workerear/workerejb-0.0.1-SNAPSHOT/MyAbstractClassExtender!learning.lib.MyInterface");
        c2.print();
    }

}

從接口中刪除@Remote並將其添加到bean中可以解決此問題:

public interface MyInterface {
    public void print();

}

@Stateless
@Remote(MyInterface.class)
public class MyBean extends MyAbstractClass{

    @Override
    public void print() {
        System.out.println("MyAbstractClassExtender.PRINT");

    }

}

然后,JNDI綁定將是這樣的:

java:global/workerear/workerejb-0.0.1-SNAPSHOT/MyBean!learning.lib.MyInterface

和演員的作品。

批注處理器檢查Implements子句中的接口,以確定遠程/本地接口。 因為在這種情況下接口是繼承的,並且未在Implements子句中明確定義,所以注釋處理器將采用容器的默認行為。

一種解決方案是在Bean中添加一個工具:

@Stateless
public class MyBean extends MyAbstractClass implements MyInterface{
    @Override
    public void print() {
        System.out.println("MyAbstractClassExtender.PRINT");

    }
}

答案中所述的另一個方法是在bean中聲明遠程接口,而不是:

@Stateless
@Remote(MyInterface.class)
public class MyBean extends MyAbstractClass{

    @Override
    public void print() {
        System.out.println("MyAbstractClassExtender.PRINT");

    }
}

一種方法相對於另一種方法會有優點和缺點。 我發現此博客非常有趣http://piotrnowicki.com/2013/03/defining-ejb-3-1-views-local-remote-no-interface/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM