- PR -

EJBException発生の原因を探しております(JBOSS4.02)

1
投稿者投稿内容
むっき
会議室デビュー日: 2005/06/27
投稿数: 7
投稿日時: 2005-09-13 22:17
JBOSS4.02、J2SDK1.4を使ってます。
同じJBOSS内にサーブレットプログラムとEJBプログラムを配置してます。
サーブレットプログラム内からセッションBeanを次のように呼び出してます。

try{
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.
NamingContextFactory");
ht.put(Context.PROVIDER_URL,"jnp://localhost:1099");
ctx = new InitialContext(ht);
Object obj = ctx.lookup("test/A");
test.AHome home = (test.AHome)PortableRemoteObject.narrow( obj, test.
AHome.class );
test.A testRemote = home.create();//←ここでEJBExceptionが発生します。
} catch (RemoteException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}

ブレークで追っていくと、home.create()でEJBExceptionが発生いたします。

21:07:53,633 ERROR [LogInterceptor] EJBException in method: public
abstract test.A test.AHome.create() throws javax.ejb.CreateException,
java.rmi.RemoteException:
javax.ejb.EJBException: Invalid invocation, check your deployment
packaging, method=public abstract test.A test.AHome.create() throws
javax.ejb.CreateException,java.rmi.RemoteException
at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.
invokeHome(StatelessSessionContainer.java:161)
at org.jboss.resource.connectionmanager.
CachedConnectionInterceptor.invokeHome(CachedConnectionInterceptor.java:
212)
at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.
invokeHome(StatelessSessionInstanceInterceptor.java:81)
at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome
(AbstractInterceptor.java:90)


ejb-jar.xmlの内容は以下のとおりです。

<session >
<description><![CDATA[<PRE><FONT SIZE="3"></FONT></PRE>]]></
description>
<ejb-name>test/A</ejb-name>
<home>test.AHome</home>
<remote>test.A</remote>
<local-home>test.ALocalHome</local-home>
<local>test.ALocal</local>
<ejb-class>test.ASession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>

サーブレットからではなく、main付のJAVAクラスから実行する分には動きます。
サーブレットから動かす場合、どういう呼び出し方をすればよいのでしょうか?

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-09-13 23:25
例外を送出している箇所は、ホームメソッドの呼び出しをチェックしてるところですね。
jboss-4.0.2-src/server/src/main/org/jboss/ejb/StatelessSessionContainer.java

呼び出そうとしたメソッドが実装側に存在しないようです。
ホームインタフェースにしかないメソッドを呼び出してたりしませんか?
むっき
会議室デビュー日: 2005/06/27
投稿数: 7
投稿日時: 2005-09-14 09:28
あしゅ様
例外の意味は、わかりました。ありがとうございます。

早速、ホームインタフェースにしかないメソッドの呼び出しがあるかないかをみてみました。
home.create()で発生しているエラーなので、create()に着眼しましたが、
実装側にejbCreate()の記述は必要でもcreate()は必要なのでしょうか?
JAVAのmain付のクラスからjavacで起動した場合は、同じセッションBeanが呼べます。
サーブレットとして起動した場合、今の現象が起きます。

現発生ソースは以下のようになってます。

ホームは、
public interface AHome
extends javax.ejb.EJBHome
{
public static final String COMP_NAME="java:comp/env/ejb/test/A";
public static final String JNDI_NAME="test/A";

public A create()
throws javax.ejb.CreateException,java.rmi.RemoteException;

}
リモートオブジェクトは、
public interface A
extends javax.ejb.EJBObject
{
public java.util.HashMap abc( java.util.HashMap logcreateInfo )
throws java.rmi.RemoteException;
}
実装クラスは、
public class ASession
extends harp.cjm.ejb.parts.ABean
implements javax.ejb.SessionBean
{
public void ejbActivate() { }
public void ejbPassivate() { }
public void setSessionContext(javax.ejb.SessionContext ctx) { }
public void unsetSessionContext() { }
public void ejbRemove() { }
public void ejbCreate() throws javax.ejb.CreateException { }
}

ASessionの親クラスとして
public abstract class ABean implements javax.ejb.SessionBean {
public HashMap abc(HashMap logcreateInfo){
return abcLogic(logcreateInfo);
}
}

ヒントになるようなことありましたら、教えてください。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-09-14 10:00
Servletの環境エントリに登録して呼んでも同じ現象が発生するでしょうか。
むっき
会議室デビュー日: 2005/06/27
投稿数: 7
投稿日時: 2005-09-14 11:29
Anthyhime様
ありがとうございます。
愚問かもしれませんが、
Servletの環境エントリの設定は、サーブレットからEJbを呼ぶ場合必須なのでしょうか?
勉強不足で申し訳ございません。

早速Servletの環境エントリの設定を試してみました。

まず、EJB側にjboss-web.xmlが無かったので作成しました。

<jboss-web>
<ejb-ref>
<ejb-ref-name>ejb/A</ejb-ref-name>
<jndi-name>test/A</jndi-name>
</ejb-ref>
</jboss-web>

そして、EJBをデプロイします。
配置されたJARの内容をみると、jboss-web.xmlは含まれて降ります。
これは成功します。

次にサーブレット側のweb.xmlに以下の設定を行いました。
<web-app>
      :
  (略)
      :
<ejb-ref>
<ejb-ref-name>ejb/A</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>test.AHome</home>
<remote>test.A</remote>
</ejb-ref>

</web-app>

勉強不足で申し訳ございません。
サーブレット側をJBOSSに配置すると、以下のエラーが発生します。
11:26:37,825 INFO [TomcatDeployer] deploy, ctxPath=/AServlet, warUrl=file:/D:/jboss-4.0.2/server/default/tmp/deploy/tmp21954AServlet-exp.war/
11:26:37,905 ERROR [WebModule] Starting failed jboss.web.deployment:id=-788780953,war=AServlet.war
org.jboss.deployment.DeploymentException: Error during deploy; - nested throwable: (javax.naming.NamingException: ejb-ref: ejb/A, no ejb-link in web.xml and no jndi-name in jboss-web.xml)
at org.jboss.web.AbstractWebDeployer.start(AbstractWebDeployer.java:366)
at org.jboss.web.WebModule.startModule(WebModule.java:68)

http://www.ingrid.org/java/jserv/performance/dd.html

すみません、このエラーの原因何が考えられますか?
web.xmlの中に記載されている定義からjboss-web.xmlの中にJNDI名が見つけられないって言われているような気がします。

1

スキルアップ/キャリアアップ(JOB@IT)