我写了一个比较简单的JSP+SBEAN+CMP的调用,问题不少,请高手指点!!

04-01-05 henry.t
我要崩溃了,看了J2EE得书(EJB),现在想要做一些试验,4天以来,我居然一个试验都没有做出来,出现一大堆问题,头疼阿~~~现在,我就把我的这个简单的试验结构和问题和大家讨论一下,帮我看看到底除了什么问题。

我的系统架构:WEBLOGIC8.1+JBUILDERX 数据库是SQL2000

这两个东西现在我已经安装完成了,而且整合完毕

我的试验计划是这样:

数据库建立一张表TABLE,只有两个字段 ID NAME

写一个CMP映射到这张表,写一个FINDALL方法,返回所有记录COLLECTION

因为书上说最好不要直接用客户端调用ENTITYBEAN,所以我写一个STATELESS BEAN来调用这个CMP,然后计划用JSP做远程客户端来调用这个SBEAN

首先大家看看我这个结构有没有问题???????????????????

由于这两个EJB都是在一个WEBLOGIC里面所以我想我可以使SBEAN 直接调用CMP的LOCAL接口(CMP是LOCAL的),这个该没有问题吧???????????????

这里要说明的是,CMP和SBEAN被打在不同的JAR包里面,部署描述XML文件也就当然是分开的,但是代码上写的,两个EJB都属于一个PACKAGE PROJECT,所以我想应该可以LOCAL调用的吧????(也就是说,这两个EJB属于两个EJB MODULE,还有一种方法是把他们放在一个MODULE里面,也就是一个JAR包,不知道这两种方法有什么区别???????)

可是当我写那个SBEAN的时候问题就全出来了

我写了三个方法:GETCMP(INT ID)返回一条记录 (返回CMP的LOCAL接口)

GETCMPS() 返回所有记录 (COLLECTION)

ADDCMP(INT ID , STRING NAME) 加入一条记录

这个SBEAN暴露的是远程接口,供远程客户JSP调用

在把这个SBEAN编译打包的时候(CMP已经在之前编译打包成另一个JAR了),报出一大堆错误,如下:

mothod getcmp(int) exposes local interface types through the remote interface of the bean.this is not allowed.

意思大概是:这个方法通过远程接口暴露了本地接口。

说明一下,GETCMP(INT)这个方法里面调用了CMP本地HOME接口中的FIND方法,得到一个CMP的本地接口,然后把它返回给客户。我错在那?主要是应该怎么做才不错?

call-by-reference is not enabled for the ejb "SBEAN", the server will have better performance if it is enabled, set this element to true in the weblogic-ejb-jar.xml deployment descriptor for this ejb.

我找了半天,没有找到,请问JBUILDERX中怎么设置?还有,这个元素到底什么意义???????

in ejb SBEAN, the throws clause for method GETCMP/GETCMPS/ADDCMP in the bean class contains exceptions that are not in the throws clause of the remote interface

这个就是在不明白了,在SBEAN里面,这些方法由于调用了CMP的HOME接口中的FIND和CREATE方法,所以要抛出FINDEREXCEPTION和CREATEXCEPTION,还有,由于要在方法里面用JNDI查找CMP,所以要抛出NAMINGEXCEPTION,我嫌麻烦,就直接抛出EXCEPTION了,这有什么问题??当然,SBEAN远程接口对应的方法抛出的是REMOTEXCEPTION。请指点!!!

问题多多,弄得我好心烦,请大家想想你们刚开始学习的时候的麻烦,帮帮帮我一下,回答我上面的每一个问题

henry.t
2004-01-05 17:44
寒心~

henry.t
2004-01-06 18:57
给我一个远程JSP调用EJB来实现查询数据库内容然后返回给JSP的实现方案吧!统一

i_love_this_game
2004-01-07 19:57
Sorry for not to be able to type chinese.

The local interface can only be called by within the same JVM. Reason is simple : they are called through IPC instead of RMI.

You are right that you can wrap your EntityBean local interface inside a SessionBean but returning a local interface to client is totally wrong. You should wrap "findAll()" method instead of getCMP().

so inside your session bean you should have "findAll()" method which calls EntityBean "findAll()" and return a Collection which is returned by findAll() in entity bean

猜你喜欢