2011-12-29 7 views
0

私はglassfish 3.1とJEE6をEJB3.1で使用しています。私は単に、一つのStateless LocalBeanをno-interfaceビューで別のEJBに挿入しようとしているので、そのメソッドの1つにアクセスできます。しかし、私は即座に注射部位に配置エラーを得る。ローカルEJBを挿入できません。依存性注入が失敗しました

インターフェイス@EJBインターフェイスインターフェイスを挿入すると、

は、ローカルのejb-refの名前= com.sallie.logic.RSSbean/tclient、ローカル3.xのインターフェース= com.eb .thriftEJBinterfaces.thriftEJBinterf * エース、のejb-link = nullで、検索を参照して解決できません。 =、にmappedName =、JNDI名=、R * EFTYPE =セッション

Iは@EJB MyBeanと豆のような無インターフェイスビューを介してそれを注入する場合、

  • javax.naming.NamingExceptionの:ルックアップに失敗しました 'で、java:comp/env/COM
  • javax.naming.NamingExceptionの:例外のためEJBを解決する' リモートれるejb-ref
  • javax.naming.NameNotFoundExceptionが: C
  • javax.naming.NamingExceptionの:検索は、「Javaのに失敗しました:コンプ/ ENV/C

どんなに私はそれが動作しない注入を行う方法。私は、このプロジェクトでまったく同じことをやっている他のEJBもうまく動作しています。私のデータベースアクセスオブジェクトは注入を使用しており、まだ実行中です。なんらかの理由で、このEJBは注入されません。

編集:注釈付きクラス宣言:(基本的に、このクラスはWebアプリケーション上にはない外部サーバーへのソケット接続を作成しますが、そのアドレスはthriftというIDLを使用して利用できます。 Java SEのプログラムとして上(注:サーバログエラーは、これが問題であることを示すものではありませんLOG FILES 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

+0

@Perceptionがクラス宣言を追加しました。私は3つまたは4つの他のEJBのためにこのフォームを使用しています。何らかの理由で、このEJBが好きではありません。私はEJB内部でやろうとしていることが原因だと思います。エラーは誤解を招くだけです。私がEJBの本体をコメントアウトするとき、Glassfishは問題なく注入することができ、それが展開されるためです。 – Randnum

+1

"私のEJBの本体をコメントアウトすると、Glassfishは問題なく注入することができ、配置されます。それが事実なら、全身を投稿するべきです。 –

答えて

4

私は、ログの内容にもかかわらず、スリルコードであることを証明したと思います。それを取り除くと、注射が動作します。あなたがそれを残すと、注射は失敗します。それはスリフトコードで非常に強く指摘しています。

これはクラスローディングの問題と思われます。アプリケーションサーバーは、Thriftライブラリを見つけることができないか、間違ったバージョンを見つけます。その結果、クラスはロードされないか、インスタンス化できません。この失敗は、EJBをインスタンス化できないことを意味します。つまり、参照が失敗します。

エラーが記録される原因となる基本的な例外が予想されますが、これはアプリケーションサーバーのバグまたは監視の可能性があります。そのようなことはうつ状態で頻繁に起こります。

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

をそしてメソッドが呼び出されたときに何を得る参照してください。

私はないEJBの本当に簡単なテストバージョンを書いてみたいです。

+0

これは出力した: SEVERE:java.lang.ClassNotFoundExceptionが:com.sun.enterprise.loader.ASURLClassLoader.findClassDataでorg.apache.thrift.transport.TSocket \t(ASURLClassLoader.java:808) \tコムでjava.lang.ClassLoader.loadClass(ClassLoader.java:247で.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:696) java.lang.ClassLoader.loadClassで\t(ClassLoader.java:306) \t ) – Randnum

+0

答えとして受け入れます。これらの誤解を招くサーバーログを見たことがあります。ありがとう。今、グラスフィッシュがこれらのライブラリファイルを見ることができない理由を見つけよう...別のトピック! – Randnum

+0

本当に、@ Perceptionの第2のコメントには解決策がありました。私はちょっと詳しく説明しました。 –

関連する問題