0

我在 glassfish3 上部署了一个带有 actionclasses 和一个外观的 war 文件,以及一个带有 ejb 组件(一个无状态 bean、几个实体和一个 persistence.xml)的 jar 文件。我的问题是我无法从我的门面找到到无状态 bean 的远程接口。

我的 bean 和界面如下所示:

@Remote
public interface RecordService {...


@Stateless(name="RecordServiceBean", mappedName="ejb/RecordServiceJNDI")
public class RecordServiceImpl implements RecordService {

 @PersistenceContext(unitName="record_persistence_ctx")
 private EntityManager em;...

如果我查看 server.log 便携式 jndi 看起来像:

Portable JNDI names for EJB RecordServiceBean : [java:global/recordEjb/RecordServiceBean, java:global/recordEjb/RecordServiceBean!domain.service.RecordService]|#]

和我的门面:

...InitialContext ctx= new InitialContext();
    try{
       recordService = (RecordService) ctx.lookup("java:global/recordEjb/RecordServiceBean!domain.service.RecordService");
      }
      catch(Throwable t){
       System.out.println("ooops");
       try{
        recordService = (RecordService)ctx.lookup("java:global/recordEjb/RecordServiceImpl");
       }
       catch(Throwable t2){
        System.out.println("noooo!");
       }...



  }

当外观第一次调用时,会发生此异常:

javax.naming.NamingException: Lookup failed for 'java:global/recordEjb/RecordServiceBean!domain.service.RecordService' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfacedomain.service.RecordService [Root exception is java.lang.ClassNotFoundException: domain.service.RecordService]]

第二个电话:

javax.naming.NamingException: Lookup failed for 'java:global/recordEjb/RecordServiceBean' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfacedomain.service.RecordService [Root exception is java.lang.ClassNotFoundException: domain.service.RecordService]]

我还测试了使用@EJB-annotation 注入bean:

@EJB(name="RecordServiceBean")
 private RecordService recordService;

但这也不起作用。我错过了什么?我尝试使用 ejb-jar.xml 但这不应该是必要的。有没有人可以告诉我如何解决这个问题?

4

3 回答 3

2

我找到了解决这个问题的方法。如果我将接口文件打包到 jarfile 中并将该 jar 放入 warfile 中的 WEB-INF/lib 中,问题就解决了。

于 2010-05-21T11:58:37.500 回答
0

当服务器启动时,接口的全局 jndi 名称显示在控制台中。使用这些来查找接口,而不是尝试通过显式命名来调用它们。

于 2010-06-15T12:27:32.487 回答
0

您是否尝试过注释掉xml 文件中所有与 ejb 相关的部分,然后只使用

@Stateless
public class RecordServiceImpl implements RecordService {

and then 

@EJB
private RecordService recordService;

他们试图在 EJB 3.1 中使该过程相当脑残此外,虽然 JNDI 浏览没有进入 gf 3.0,但您可以使用以下方法挖掘一些信息

asadmin list-jndi-entries --context java:global/yourAppName
于 2010-09-29T18:30:03.627 回答