0

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.

Community
  • 1
  • 1
tinnapat
  • 356
  • 2
  • 12
  • How do you lookup the data source? Can you try with this. http://stackoverflow.com/a/4099163/3176125 – Pubci Feb 25 '17 at 10:18
  • Thank you for your suggestion, I have look at the link you provided but it is not related to my problem. In my case I got exception only when I put the lookup code inside static block/constructor but worked fine if I use same lookup inside a method. Since in WSO2 the code is deployed as OSGI bundle so I think it is the problem with bundle load order. – tinnapat Feb 25 '17 at 10:36

0 Answers0