在 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>