![](/img/trans.png)
[英]I can't setup my jndi.properties to access remote EJBs on Jboss 5
[英]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.