fredy: JSP: Problem beim öffnen einer JDBC-Connection

Hi!

Ich möchte in einer JSP eine JDBC-Connection öffnen.
Die dafür nötigen Packages (javax.sql, JDBC-Treiber) sind in den
Verzeichnis /common/classes bzw. /common/lib

Beim Öffnen der Connection erhalte ich den folgenden Fehler:
javax.servlet.ServletException: Cannot create resource instance

Was mache ich falsch? Wie könnte ich den Fehler eingrenzen?

Danke und liebe Grüße
Manfred Steyer

ps.:
Der genaue Stack-Trace:

javax.servlet.ServletException: Cannot create resource instance
 at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:463)
 at org.apache.jsp.test$jsp._jspService(test$jsp.java:78)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java)
 at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
 at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
 at java.lang.Thread.run(Thread.java:484)

root cause

javax.naming.NamingException: Cannot create resource instance
 at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:167)
 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:834)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:181)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:822)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:194)
 at org.apache.jsp.test$jsp._jspService(test$jsp.java:67)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java)
 at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
 at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
 at java.lang.Thread.run(Thread.java:484)

  1. Hallo Manfred,

    Ich möchte in einer JSP eine JDBC-Connection öffnen.
    Die dafür nötigen Packages (javax.sql, JDBC-Treiber) sind in den
    Verzeichnis /common/classes bzw. /common/lib

    Du benutzt also offensichtlich Tomcat als Servlet/JSP-Container.

    Dann musst du aber Tomcat auch entsprechend konfigurieren, also
    1. im Deployment Descriptor für Deine Web-Applikation eine Resource-Referenz angeben
    2. In der server.xml die Resource anmelden
    3. In der Tomcat-Konfiguration den Namen der JDBC-Ressource dem Kontext der Webapplikation mitgeben (die geworfene Naming-Exception deutet in diese Richtung!)

    Steht hier z.B. ganz gut beschrieben (http://java.sun.com/webservices/docs/1.0/tutorial/doc/WebApp13.html#69868), v.a. wenn du mit Tomcat 4.1x arbeitest. Läßt sich aber auch für die 4.0.x Versionen rauslesen was zu tun ist

    Beim Öffnen der Connection erhalte ich den folgenden Fehler:
    javax.servlet.ServletException: Cannot create resource instance

    Was mache ich falsch? Wie könnte ich den Fehler eingrenzen?

    Zunächst mal die Konfiguration überprüfen.
    Evtl. Rechteprobleme?

    Gruß
    Franz

    1. Hallo!

      Danke - Aber ich glaube, dass ich das gemacht habe:

      :: web.xml

      <Context path="" docBase="ROOT" debug="1" reloadable="true">
      <Resource name="jdbc/autodb" auth="Container"
                 type="javax.sql.DataSource"/>
      <ResourceParams name="jdbc/autodb">
        <parameter>
          <name>user</name>
          <value>...</value>
        </parameter>
        <parameter>
          <name>password</name>
          <value>...</value>
        </parameter>
        <parameter>
          <name>driverClassName</name>
          <value>org.gjt.mm.mysql.Driver</value>
        </parameter>
        <parameter>
          <name>driverName</name>
          <value>autodb=jdbc:mysql://172.22.51.208/db</value>
        </parameter>
      </ResourceParams>
      </Context>

      :: server.xml

      <web-app>
      <resource-ref>
        <description>
        </description>
        <res-ref-name>
          jdbc/autoDB
        </res-ref-name>
        <res-type>
          javax.sql.DataSource
        </res-type>
        <res-auth>
          Container
        </res-auth>
      </resource-ref>
      </web-app>

      Muss ich sonst noch ein File bearbeiten ?

      Danke und lG
      fredy

      1. Hallo,

        :: web.xml

        <Context path="" docBase="ROOT" debug="1" reloadable="true">
        <Resource name="jdbc/autodb" auth="Container"
                   type="javax.sql.DataSource"/>
        <ResourceParams name="jdbc/autodb">
          <parameter>
            <name>user</name>
            <value>...</value>
          </parameter>
          <parameter>
            <name>password</name>
            <value>...</value>
          </parameter>
          <parameter>
            <name>driverClassName</name>
            <value>org.gjt.mm.mysql.Driver</value>
          </parameter>
          <parameter>
            <name>driverName</name>
            <value>autodb=jdbc:mysql://172.22.51.208/db</value>
          </parameter>
        </ResourceParams>
        </Context>

        Also das obere steht bei mir nicht in der web.xml, sondern in der server.xml und das untere in der web.xml. Da wirst Du dich vermutlich aber nur veschusselt haben. Allerdings stimmen die Namen der Ressource nicht überein. Oben hat das name-Attribut des <Resource>-Elements den Wert "jdbc/autodb", während der Inhalt des Elements <res-ref-name> "jdbc/autoDB" lautet (db versus DB!). Kontextsensitivität vorausgesetzt, matchen die Namen nicht und es wird eine Naming-Exception geworfen.

        :: server.xml

        <web-app>
        <resource-ref>
          <description>
          </description>
          <res-ref-name>
            jdbc/autoDB
          </res-ref-name>
          <res-type>
            javax.sql.DataSource
          </res-type>
          <res-auth>
            Container
          </res-auth>
        </resource-ref>
        </web-app>

        Gruß
        Franz

        1. Hi!

          Jetzt hab ichs angepasst, sodass es überall autoDB heisst.
          Aber es funzt noch immer nicht.

          Muss man sonst noch irgendwo was einstellen ?

          Danke und lG
          fredy

          Hallo,

          :: web.xml

          <Context path="" docBase="ROOT" debug="1" reloadable="true">
          <Resource name="jdbc/autodb" auth="Container"
                     type="javax.sql.DataSource"/>
          <ResourceParams name="jdbc/autodb">
            <parameter>
              <name>user</name>
              <value>...</value>
            </parameter>
            <parameter>
              <name>password</name>
              <value>...</value>
            </parameter>
            <parameter>
              <name>driverClassName</name>
              <value>org.gjt.mm.mysql.Driver</value>
            </parameter>
            <parameter>
              <name>driverName</name>
              <value>autodb=jdbc:mysql://172.22.51.208/db</value>
            </parameter>
          </ResourceParams>
          </Context>

          Also das obere steht bei mir nicht in der web.xml, sondern in der server.xml und das untere in der web.xml. Da wirst Du dich vermutlich aber nur veschusselt haben. Allerdings stimmen die Namen der Ressource nicht überein. Oben hat das name-Attribut des <Resource>-Elements den Wert "jdbc/autodb", während der Inhalt des Elements <res-ref-name> "jdbc/autoDB" lautet (db versus DB!). Kontextsensitivität vorausgesetzt, matchen die Namen nicht und es wird eine Naming-Exception geworfen.

          :: server.xml

          <web-app>
          <resource-ref>
            <description>
            </description>
            <res-ref-name>
              jdbc/autoDB
            </res-ref-name>
            <res-type>
              javax.sql.DataSource
            </res-type>
            <res-auth>
              Container
            </res-auth>
          </resource-ref>
          </web-app>

          Gruß
          Franz