0

簡単な運動プログラムに問題があります。スレッドからSession Beanを呼び出したいのですが、NullPointer例外になってしまいます!しかし、メインスレッドから呼び出すと、正常に実行できます

これは警告と例外です

Warning: C:\Documents andSettings\User\MyDocuments\NetBeansProjects\ThreadCounter\dist\gfdeploy\ThreadCounter does not exist.
Exception in thread "Thread-2" java.lang.NullPointerException
at threadcounter.Main.run(Main.java:14)
at java.lang.Thread.run(Thread.java:744)

これは、リモート セッション Bean を呼び出す実行可能なクラスです。

package threadcounter;

import javax.ejb.EJB;
import mysessionbean.CounterSessionBeanRemote;

public class Main implements Runnable {
@EJB
private static CounterSessionBeanRemote counterSessionBean;

@Override
public void run() {
 System.out.println("counter : "+counterSessionBean.getCounter());  //NullPointer
  } 
}

これが私の主な機能です

package threadcounter;

public  class Ya {

public static void main(String[] args){
Main t1 = new Main();
new Thread(t1).start();
  }

}

これがセッションビーンです

package mysessionbean;

import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;

@Stateless
public class CounterSessionBean implements CounterSessionBeanRemote {
private int counter = 0;

@Override
public int getCounter() {
    int temp = counter;
    temp++;
    Random r = new Random();
    try {
    Thread.sleep(r.nextInt(20));
    } catch (InterruptedException ex) {
    Logger.getLogger(CounterSessionBean.class.getName()).log(Level.SEVERE, null, ex);
    }
    counter = temp;
    return counter;
}


}
4

2 に答える 2

1

このようにコンテナで管理されていないクラスに @EJB を使用して EJB を注入することはできません

@EJB
private static CounterSessionBeanRemote counterSessionBean;

あなたのクラスは、それを機能させるために管理されたコンテナでなければなりません。それ以外の場合は、jndi ルックアップで実行できます

Context jndiContext = new InitialContext();
CounterSessionBeanRemote bean = (CounterSessionBeanRemote ) jndiContext.lookup("....");

もう 1 つは、@EJB アノテーションを使用して、後でコンストラクターで値を割り当てる理由です。これを行う意味はありません。

簡単な演習をうまく行うために、少なくともこのhttp://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html#girflを読み通すことをお勧めします。

于 2013-11-24T19:06:16.740 に答える
1

私はそれを理解しました!メイン関数にセッション Bean を注入し、セッション Bean をコンストラクターを使用してスレッドに渡す必要があります。

package threadcounter;

import javax.ejb.EJB;
import mysessionbean.CounterSessionBeanRemote;

public class Main implements Runnable {
    @EJB
    private static CounterSessionBeanRemote counterSessionBean;
    Main(CounterSessionBeanRemote x){
        counterSessionBean = x;
    }
   @Override
   public void run() {
   System.out.println("counter : "+counterSessionBean.getCounter());   
   }
}

これは main 関数を含むクラスです

package threadcounter;

import javax.ejb.EJB;
import mysessionbean.CounterSessionBeanRemote;
public  class Ya {
 @EJB
private static CounterSessionBeanRemote counterSessionBean;

  public static void main(String[] args){
  Main t1 = new Main(counterSessionBean);
  new Thread(t1).start();
  Main t2 = new Main(counterSessionBean);
  new Thread(t2).start();
  Main t3 = new Main(counterSessionBean);
  new Thread(t3).start();
  Main t4 = new Main(counterSessionBean);
  new Thread(t4).start();
  }

}
于 2013-11-24T05:11:01.560 に答える