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. 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) で
Webメソッドから同じことをしようとすると、すべて正常に動作します。
@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 を検索できないのはなぜですか?
仕様から、PostConstruct から java:comp/env への JNDI アクセスが可能です...
ありがとう
更新:
web.xml で次のように宣言された BrowserService
<ejb-local-ref>
<ejb-ref-name>BrowserService</ejb-ref-name>
<local>browser.service.IBrowserService</local>
</ejb-local-ref>