0

EJB を使用する Java で単純な Web サービスを開発しようとしています。Jar ファイルに EJB があり、war ファイルに WebServices があり、どちらも 1 つの耳にパッケージ化されています。JBOSS-AS 7.1 で EjB 3.0 を使用します。

ここで、インターフェースを持つ私のEJBクラス:

@Stateless
public class TestEjb implements ITestEjb {

    public boolean authentifier(String login, String password) {
        if(login.equals("nico") && password.equals("nr"))
            return true;
        else 
            return false;
    }

}

@Local
public interface ITestEjb {
    public boolean authentifier(String login, String password);
}

そして、前の EJBを注入する私のWeb サービスは次のとおりです。

//@Stateless
@WebService
@SOAPBinding(style = Style.RPC)
public class AuthentificationWS {
    @EJB
    private ITestEjb testEjb;

   public boolean authentifier(String login,String password) {
       return testEjb.authentifier(login, password);
   }
}

デプロイメントはうまく機能しますが、Web サービスを呼び出すと、EJB は常にnullになります
(error : java.nullpointerException).

そのため、Web サービスにを追加し@Statelessて EJB に変換しようとしましたが、Web サービス クライアントで使用しようとすると成功しませんでした。

次に、JBOSSログでローカルjndi URLを取得して、以下のようにローカルjndiルックアップでEjbにアクセスしようとしました:

final String jndi = "java:module/TestEjb!fr.test.ITestEjb";
testEjb = (ITestEjb) new InitialContext().lookup(jndi);

しかし、うまくいきませんでした。

最後に、以下のようなグローバル jndi URLを試してみました。

final String jndi = "ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb"
testEjb = (ITestEjb) new InitialContext().lookup(jndi);

そして、それはうまくいきます!!

では、Web サービスがインジェクションまたはローカル Jndi の方法でローカルに EJB にアクセスできない理由がわかりません。

4

3 に答える 3

3

その理由は、JBOSS-AS 7.1 では ejb サービスが異なる方法でデプロイおよびマッピングされるためです。ステートレス Bean のマップされた名前を指定しない場合は、ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test のように、そのグローバル名を使用して検索する必要があります。 .ITestEjb

次の方法で、マップされた名前を追加することができます。

@Stateless(name = "ejb/ar/TestEjb", mappedName = "ejb/ar/TestEjb")
public class TestEjb implements ITestEjb {

そしてあなたのウェブサービスで:

@EJB(name = "ejb/ar/TestEjb", mappedName = "ejb/ar/TestEjb")
private ITestEjb testEjb;

そしてあなたのweb.xmlで:

<ejb-local-ref>
    <ejb-ref-name>ejb/ar/TestEjb</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>yourpackage.TestEjb</local>
</ejb-local-ref>

この場合、Web サービスを Web モジュールとしてデプロイしていると仮定します。Web サービスを Web モジュールとしてデプロイする方法については、次のリンクを参照してください: http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/

于 2013-01-14T14:28:51.010 に答える
1

以前に使用した: new InitialContext().lookup(java:app/domain/TestService) ear に変換して使用:

@Local
@Remote
public interface Test {}

@Stateless(name="Test", mapped-name="Test")
public TestService implements Test {}

@Webservice
public MyService{
     @EJB(name="Test", mapped-name="Test")
     private Test test;
}

これは機能しているように見えますが、Test インターフェイス ():) で @Remote を設定する必要があります。Web サービスは戦争中、ドメインは jar にあり、両方が ear に含まれており、Glassfish (3.1.2) にデプロイされています。アノテーション @Remote を使用しなければならなかったのは残念です。なぜなら、それはすべて同じ耳にあるからです。@Remote を省略すると、Glassfish でデプロイ時に例外が発生します。「EJB に ejb-ref を設定しようとしていますが、EJB はリモート インターフェイスを定義していません」@Remote を省略する方法はありますか??

于 2013-02-26T10:27:45.453 に答える
-1

インターフェースなしで試してみてください。もはや EJB3.x でインターフェースを定義する必要はありません。

@Stateless
public class TestEjb {

    public boolean authentifier(String login, String password) {
        if(login.equals("nico") && password.equals("nr"))
            return true;
        else 
            return false;
    }

}

次に、次のようにWebサービスに挿入します

@WebService
public class AuthentificationWS {
   @EJB
   private TestEjb testEjb;

   public boolean authentifier(String login,String password) {
       return testEjb.authentifier(login, password);
   }
}
于 2012-07-21T06:47:25.093 に答える