java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource нельзя преобразовать в org.apache.tomcat.jdbc.pool.DataSource

Я запускаю Tomcat 7.0.22 и написал простой сервлет, который подключается к базе данных SQL Anywhere 12.0. Когда я запускаю сервлет, я получаю java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource нельзя преобразовать в org.apache.tomcat.jdbc.pool.DataSource. Мой файл ./META-INF/content.xml выглядит следующим образом:

<Context>
  <Resource name="jdbc/FUDB"
           auth="Container"
           type="javax.sql.DataSource"
           username="dba"
           password="sql"
           driverClassName="sybase.jdbc.sqlanywhere.IDriver"
           factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

url = "jdbc: sqlanywhere: uid = dba; pwd = sql; eng = BTH476331A_FedUtilization;" accessToUnderlyingConnectionAllowed = "true" maxActive = "8" maxIdle = "4" />

Мой webapp web.xml выглядит так:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import org.apache.catalina.core.StandardContext.*;
import org.apache.tomcat.jdbc.pool.*;
import com.sapgss.ps.dbutil.*;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

public class Report1 extends HttpServlet {

    public void doGet(HttpServletRequest request,
0.xsd" version="3.0" metadata-complete="true"> <display-name>FedUtilization</display-name> <servlet> <servlet-name>Report1</servlet-name> <display-name>Report1</display-name> <servlet-class>com.sapgss.ps.servlet.Report1</servlet-class>

Report1 / Report1
SQL Anywhere 12.0.1 сервер jdbc3 jdbc / FUDB javax.sql.DataSource Container

Код сервлета следующий:

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import org.apache.catalina.core.StandardContext.*;
import org.apache.tomcat.jdbc.pool.*;
import com.sapgss.ps.dbutil.*;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

public class Report1 extends HttpServlet {

    public void doGet(HttpServletRequest request,

HttpServletResponse response) throws IOException, ServletException { try { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("Hello Elaine!"); out.println(""); out.println(""); out.println("

Привет, Элейн!

");
// This is how to code access to the database in Java Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/FUDB"); Connection conn = ds.getConnection(); . . .
} }

Ошибка возникает, когда я пытаюсь получить DataSource в этой строке: DataSource ds = (DataSource) envCtx.lookup ("jdbc / FUDB");

Заранее спасибо. Я выдергиваю волосы.


person user981052    schedule 05.10.2011    source источник
comment
Я исправил эту проблему. Мне нужно было создать файл context.xml в папке% CATALINA% / localhst / webappname.xml.   -  person user981052    schedule 06.10.2011


Ответы (3)


В моем случае я просто забыл поставить:

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

в моем /tomcat7/conf/context.xml. Просто добавил, и все заработало.

Мой context.xml:

<Context> 
    <Resource name="jdbc/gestrel" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://127.0.0.1:5432/g...."
    username="postgres"
    password="....." maxActive="20" maxIdle="10"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
   maxWait="-1"/>
</Context>
person ftfarias    schedule 06.01.2012
comment
Вы, сэр, мой герой. Это заслуживает множества взлетов. - person Mr.Turtle; 26.03.2015
comment
Это сработало для меня, но я обновил factory = org.apache.tomcat.jdbc.pool.DataSourceFactory в server.xml вместо context.xml! - person rsudha; 15.06.2015

Сегодня я потратил полдня, пытаясь разобраться с подобной проблемой. У меня есть файл tomcat server.xml, определяющий контекст следующим образом:

<Context docBase="app" path="/my_context_path">
</Context>

Затем я попытался добавить поддержку пула jdbc, используя org.apache.tomcat.jdbc.pool.DataSource.

Просто добавлено определение ресурса в мое определение контекста server.xml (см. Выше). И, конечно, я определил ссылку на ресурс в своем web.xml.

Но всегда возвращался org.apache.tomcat.dbcp.dbcp.BasicDataSource. Я потратил время на отладку кота и наконец дошел до следующего:

  1. If I define resource in server.xml context - tomcat does NOT pick that up.
  2. If define in web archive's META-INF/context.xml works ok.
  3. If define in server.xml GlobalNamingResources tag - tomcat does NOT pick that up.
  4. If define in tomcat global context.xml file works ok.

Если вы укажете ссылку на ресурс в web.xml для плохих случаев 1,3 - tomcat вернет org.apache.tomcat.dbcp.dbcp.BasicDataSource, потому что, как я вижу, это своего рода значение по умолчанию. НО использование такого возвращенного источника данных вызовет что-то вроде этого:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

Если не указать ссылку на ресурс в web.xml, вы получите исключение, сообщающее, что ресурс с таким именем не может быть найти.

Также я заметил, что для хороших случаев 2,4 указывать ссылку на ресурс в web.xml необязательно (работает с ссылкой на ресурс и без нее).

Попробуйте некоторые из описанных мною случаев. Надеюсь, что-то поможет.

Я бы попытался определить ресурс в глобальном файле context.xml tomcat.

Удачи!

P.s. Я тоже использую версию 7.0.22.

person dpetruha    schedule 16.11.2011

Решение состоит в том, чтобы импортировать javax.sql.DataSource в ваш сервлет, когда вы определяете ресурс в context.xml типа = "javax.sql.DataSource"

person user3017633    schedule 16.01.2015