dev@glassfish.java.net

Resources declared in context.xml vs web.xml

From: Lance J. Andersen <Lance.Andersen_at_Sun.COM>
Date: Fri, 31 Oct 2008 12:35:12 -0400

Hi everyone,

I have a question on whether the warning below is intentional:

When I start prelude I get the following warning:

WARNING: This web app [/C:/Netbeans/JPAWeb_V3/build/web/] has no
resource reference by the name of [jdbc/mysqlTestDB]


I have this resource defined in context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JPAWeb_V3">
    <Resource
        name="jdbc/mysqlTestDB"
        auth="Container"
        type="javax.sql.DataSource"/>

</Context>


The sun-web.xml contains:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application
Server 9.0 Servlet 2.5//EN"
"http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
  <context-root>/JPAWeb_V3</context-root>
  <resource-ref>
    <res-ref-name>jdbc/mysqlTestDB</res-ref-name>
    <jndi-name>jdbc/mysqlTestDB</jndi-name>
  </resource-ref>
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="classdebuginfo" value="true">
      <description>Enable debug info compilation in the generated
servlet class</description>
    </property>
    <property name="mappedfile" value="true">
      <description>Maintain a one-to-one correspondence between static
content and the generated servlet class' java code</description>
    </property>
  </jsp-config>
</sun-web-app>


There is no entry in web.xml for jdbc/mysqlTestDB and the app works fine.


Now if I do not use the context.xml and instead add the entry to web.xml
I do not see the warning when I reboot (which makes sense):


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>ContactServlet</servlet-name>
        <servlet-class>demo.servlet.ContactServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ContactServlet</servlet-name>
        <url-pattern>/ContactServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ContactServlet</servlet-name>
        <url-pattern>/displayContacts</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ContactServlet</servlet-name>
        <url-pattern>/addContact</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    <resource-ref>
        <res-ref-name>jdbc/mysqlTestDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    </web-app>

I assume the warning is being generated because the context.xml is not
being taken into consideration?

Also another interesting scenario is if i do not put the resource-ref in
sun-web.xml of
  <resource-ref>
    <res-ref-name>jdbc/mysqlTestDB</res-ref-name>
    <jndi-name>jdbc/mysqlTestDB</jndi-name>
  </resource-ref>

I get the following error (which makes sense) using JSTL tag of

 <sql:query var="resultSet" dataSource="jdbc/mysqlTestDB" >
            select * from contacts
        </sql:query>

javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver found for jdbc/mysqlTestDB"


I am going to log an issue as the error can be clearer. However the
interesting part is that my app which uses Eclipselink has no issues
using the same JNDI resource:

  <persistence-unit name="JPAContactJNDIPU"
transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>jdbc/mysqlTestDB</non-jta-data-source>
        <class>demo.entity.Contact</class>
        <properties>
            <property name="eclipselink.logging.level" value="FINEST"/>
            <property name="eclipselink.ddl-generation"
value="create-tables"/>
        </properties>
    </persistence-unit>


Regards
Lance