I am writing a custom authenticator which require to lookup datasource from JNDI at startup. I got NameNotFoundException
error during startup
[2017-02-25 12:01:39,071] [Component Resolve Thread] ERROR {com.kbank.carbon.identity.authenticator.KBankAuthenticator} - Exception while looking up datasource[jdbc/API_SERVICE_DB]
javax.naming.NameNotFoundException: Name [jdbc/API_SERVICE_DB] is not bound in this Context. Unable to find [jdbc].
at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.wso2.carbon.context.internal.CarbonContextDataHolder$CarbonInitialJNDIContext.lookup(CarbonContextDataHolder.java:709)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.kbank.carbon.identity.authenticator.KBankAuthenticator.getDataSource(KBankAuthenticator.java:478)
at com.kbank.carbon.identity.authenticator.KBankAuthenticator.<clinit>(KBankAuthenticator.java:79)
at com.kbank.carbon.identity.authenticator.internal.KBankAuthenticatorServiceComponent.activate(KBankAuthenticatorServiceComponent.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:260)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:146)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:345)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197)
at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:473)
at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:217)
at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:816)
at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:783)
at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
at java.lang.Thread.run(Thread.java:745)
I looked up the data source using following code.
DataSource dataSource = (DataSource) new InitialContext().lookup(dsName);
If I moved this code from static block/constructor and put inside a method, it works fine.
I think it is because my custom authenticator was loaded before JNDI (or JDBC) features. How can I make my custom authenticator lookup datasource from JNDI during startup.
Thank you very much.