Setting up a datasource with WebSphere Liberty Profile 8.5

jdbc, jndi, websphere-liberty

Solution

WebSphere server.xml

<server>    
    <featureManager>
        <feature>jndi-1.0</feature>
        <feature>jdbc-4.1</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
                  host="localhost"
                  httpPort="9080"
                  httpsPort="9443" />

    <library id="oracle-lib">
        <fileset dir="lib" includes="ojdbc6_g.jar"/>
    </library>

    <dataSource jndiName="jdbc/oracle">
        <jdbcDriver libraryRef="oracle-lib"/>
        <properties.oracle user="orbeon" password="password"
                           url="jdbc:oracle:thin:@//localhost:1521/orbeon"/>
    </dataSource>

    <application name="orbeon" location="war/orbeon" type="war">
        <classloader commonLibraryRef="oracle-lib"/>
    </application>    
</server>

WEB-INF/ibm-web-bnd.xml

<web-bnd version="1.0"
        xmlns="http://websphere.ibm.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd">
    <virtual-host name="default_host"/>
    <resource-ref name="jdbc/oracle" binding-name="jdbc/oracle"/>
</web-bnd>

WEB-INF/web.xml

<resource-ref>
    <res-ref-name>jdbc/oracle</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Resource injection (instead of web.xml + ibm-web-bnd.xml):

@Resource(lookup = "jdbc/oracle")
DataSource ds;

Problem

My web app is getting a data source from JNDI with: ``` javax.naming.InitialContext ctx = new javax.naming.InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/db"); ``` In the app's `WEB-INF/web.xml`, I have: ``` <resource-ref> <description>DataSource</description> <res-ref-name>jdbc/db</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> ``` In the app's `WEB-INF/ibm-web-bnd.xml`, I have: ``` <web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd" version="1.0"> <virtual-host name="default_host"/> <resource-ref name="jdbc/db" binding-name="jdbc/db"/> </web-bnd> ``` In WebSphere Liberty Profile's `server.xml`, I have (keeping on the relevant parts): ``` <server description="new server"> <featureManager> <feature>jsp-2.2</feature> <feature>jdbc-4.0</feature> </featureManager> <library id="oracle-lib"> <fileset dir="lib" includes="ojdbc5_g.jar"/> </library> <dataSource jndiName="jdbc/db" jdbcDriverRef="oracle-driver" type="javax.sql.DataSource"> <jdbcDriver libraryRef="oracle-lib" id="oracle-driver"/> <connectionManager numConnectionsPerThreadLocal="10" id="ConnectionManager" minPoolSize="1"/> <properties user="user" password="password" url="jdbc:oracle:thin:@//db-server:1521/db"/> </dataSource> </server> ``` When the app attempts to get the datasource from JNDI, it fails with the following error: ``` CWNEN0030E: The @Resource factory encountered a problem getting the object instance jdbc/oracle binding object. The exception message was: failed to resolve jdbc/oracle to javax.sql.DataSource: javax.naming.NameNotFoundException: Intermediate context does not exist: jdbc/oracle ``` What I am missing here?

Original source