1

在 Glassfish 3.1.2 上部署 ear 并尝试从 Web 服务中的 @PostConstruct 方法查找 EJB bean:

   @PostConstruct
   public void init()
   {
      try
      {
         InitialContext initialContext = new InitialContext();

         browserService = (IBrowserService) initialContext.lookup("java:comp/env/BrowserService");
      }
      catch (NamingException ex)
      {
         Logger.getLogger(BrowserWS.class.getName()).log(Level.SEVERE, null, ex);
      }

   }

并得到

[#|2012-04-25T10:15:54.768+0300|SEVERE|glassfish3.1.2|browser.service.BrowserWS|_ThreadID=22;_ThreadName=admin-thread-pool-4848(4);|javax.naming.NamingException : 在 SerialContext [myEnv={java.naming.factory.initial=com.sun.enterpri se.naming.impl.SerialInitContextFactory, java.naming.factory.state=com 中查找“java:comp/env/BrowserService”失败。 sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.ur l.pkgs=com.sun.enterprise.naming} [根异常是 javax.naming.NamingException: Invocation exception: Got null ComponentInvocation]在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)

当我尝试从网络方法做同样的事情时,一切正常。

@WebMethod
   public XmlLookupResult lookup(
      @WebParam(name = "inLookupId", mode = WebParam.Mode.IN) String id,
      @WebParam(name = "inLookupParams", mode = WebParam.Mode.IN) List<String> params,
      @WebParam(name = "inFetchLimit", mode = WebParam.Mode.IN) int limit)
   {

      try
      {
         InitialContext initialContext = new InitialContext();

         browserService = (IBrowserService) initialContext.lookup("java:comp/env/BrowserService");
      }
      catch (NamingException ex)
      {
         Logger.getLogger(BrowserWS.class.getName()).log(Level.SEVERE, null, ex);
      }

      return browserService.lookup(id, params, limit);
   }

那么,为什么我不能从 @PostConstruct 方法中查找 bean?

根据规范,JNDI 可以从 PostConstruct 访问 java:comp/env ...

谢谢

升级版:

BrowserService 在 web.xml 中声明为

<ejb-local-ref>
   <ejb-ref-name>BrowserService</ejb-ref-name>
   <local>browser.service.IBrowserService</local>
</ejb-local-ref>
4

0 回答 0