2011-12-29 110 views
0

我在EJB3.1中使用glassfish 3.1和JEE6。我只是試圖用無界面視圖注入一個無狀態的LocalBean到另一個EJB中,以便我可以訪問它的一個方法。但是我立即在注射網站上發現部署錯誤。無法注入本地EJB。依賴注入失敗

如果我注入它的接口@EJB接口接口;

無法解析引用本地EJB-REF名= com.sallie.logic.RSSbean/tclient,本地3.X界面= com.eb .thriftEJBinterfaces.thriftEJBinterf * 王牌,EJB鏈接= NULL,查找=,mappedName =,JNDI名稱=,R * efType =會話

如果我通過無界面視圖中@EJB爲myBean豆注入它;

  • javax.naming.NamingException中:查找失敗 '的java:comp/env的/ COM
  • javax.naming.NamingException中的:異常解析ejb作爲' 遠程EJB-REF
  • javax.naming.NameNotFoundException: ç
  • javax.naming.NamingException中:查找失敗「的java:comp/env的/ C

無論我怎麼做這是行不通的注射。我有其他的EJB在這個項目中執行完全相同的事情,工作正常。我的數據庫訪問對象使用注入,它仍然在運行。出於某種原因,這個EJB不會注入。

編輯:類聲明與註釋:(基本上這個類創建一個套接字連接到外部服務器不在我的web應用程序,但可用在使用IDL叫做節儉該地址本進行了測試,適用於它。作爲一個Java SE程序(注:服務器日誌錯誤並不表明這是一個問題,日誌文件THROW參考和命名異常,因爲如果他們找不到EJB。)

package com.eb.thrift; 

import com.eb.thrift.sendEventMessage2; 
import com.eb.thriftEJBinterfaces.thriftEJBinterface; 

import org.apache.thrift.TException; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.transport.TSocket; 
import org.apache.thrift.transport.TTransportException; 

import javax.annotation.ManagedBean; 
import javax.ejb.Remote; 
import javax.ejb.Local; 
import javax.ejb.LocalBean; 
import javax.ejb.Singleton; 
import javax.ejb.Stateless; 

@Stateless 
@LocalBean 
public class ThriftClient{ 

    public ThriftClient() { } 

    public String sendToServer(String say) { 
     System.out.println("Entering ThriftClient's main method starting server connection..."); 

     String msg = null; 
     //**Make Socket** 
     TSocket socket = new TSocket("982.222.33.44", 30888); 

     //**Make Buffer** 
     //TSocket bufferedSocket = (socket); skipping this step because the jvm already handles 
     //the buffering on this end. 

     //**put in protocol** 
     TBinaryProtocol protocol = new TBinaryProtocol(socket); 
     //**create client to use protocol encoder** 
     sendEventMessage2.Client client = new sendEventMessage2.Client(protocol); 
     //**connect** 
     try { 
      socket.open(); 
     } catch (TTransportException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      client.ping(); 
     } catch (TException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      msg = client.sayMsg(say); 
      return msg; 
     } catch (TException e) { 
      msg = "response from server failed"; 
      e.printStackTrace(); 
     } 
     socket.close(); 
     return msg; 
    } 
} 

我試過。這與有和沒有接口,因爲我使用3.1我可以使用無接口視圖,它並沒有解決問題。

我想知道是否可以使用一些註釋參數來顯式設置映射和名稱,以便可以更好地找到引用。

+0

你可以包含你嘗試注入的bean的類聲明(帶註釋)嗎? – Perception 2011-12-29 21:44:02

+0

@Perception添加了類聲明我不知道它會有所幫助。我一直在使用這種形式3或4其他的EJB,它工作正常。出於某種原因,它不喜歡這個EJB,我認爲這是因爲我想在EJB內部做什麼,並且錯誤只是誤導。因爲當我註釋掉EJB的主體時,Glassfish允許我毫無問題地注入它並部署它。 – Randnum 2011-12-29 21:50:30

+1

「因爲當我註釋掉我的EJB的身體時,Glassfish允許我毫無問題地注入它並部署它。」如果是這種情況,那麼你應該張貼整個身體。 – 2011-12-29 21:53:59

回答

4

我認爲你已經證明,儘管日誌說什麼,節儉代碼的問題。如果你移除它,注射就會起作用;如果您將其放入,注射失敗。這在Thrift代碼中非常強烈。

我懷疑這是一個類加載問題。應用程序服務器找不到Thrift庫,或找到錯誤的版本,因此該類無法加載或無法實例化。該失敗意味着EJB無法實例化,這意味着查找失敗。

您會期望導致失敗記錄的潛在異常,但這可能是應用程序服務器中的錯誤或疏忽。這種事情經常令人沮喪地發生。

我想嘗試寫,做了EJB的一個非常簡單的測試版本:

try { 
    System.err.println(Class.forName("org.apache.thrift.transport.TSocket")); 
} 
catch (Exception e) { 
    System.err.println(e); 
} 

,看看你會得到什麼方法被調用時。

+0

這是輸出: 重度:拋出java.lang.ClassNotFoundException:org.apache.thrift.transport.TSocket \t在com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:808) \t在玉米.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:696) \t在java.lang.ClassLoader.loadClass(ClassLoader.java:306) \t在java.lang.ClassLoader.loadClass(ClassLoader.java:247 ) – Randnum 2011-12-29 23:25:06

+0

接受爲答案。您通過這些誤導性的服務器日誌看到了。謝啦。現在來找出爲什麼glassfish不能看到這些庫文件...爲另一個話題! – Randnum 2011-12-30 00:39:46

+0

真的,@ Perception的第二個評論有解決方案。我只是更詳細地闡述了它。 – 2011-12-30 00:53:41