Spring CallableStatementCreator

Привет, я новичок в Spring. Я пытался получить доступ к хранимому процессу с помощью CallableStatementCreator, но получаю следующую ошибку.

Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «SampleDataSource», определенным в ресурсе пути к классу [StoredProcCallApplication-config.xml]: создание экземпляра bean-компонента не удалось; вложенным исключением является java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

StoreProcCall.java

package Utility;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import oracle.jdbc.driver.OracleTypes;
import org.springframework.jdbc.core.CallableStatementCreator;
public class StoredProcCall implements CallableStatementCreator {
    @Override
    public CallableStatement createCallableStatement(Connection arg0)
            throws SQLException {
        // TODO Auto-generated method stub
        CallableStatement cs=arg0.prepareCall("call test_proc(?,?)");
        cs.setString(1,"Vivek");
        cs.registerOutParameter(2, OracleTypes.CURSOR);
        return cs;}}

TestCallImpl.java

package com;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import Utility.StoredProcCall;
import oracle.jdbc.driver.OracleTypes;
import Utility.StoredProcCall;
public class TestCallImpl {
    StoredProcCall storedproccall=null;
    JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource)
    {this.jdbcTemplate=new JdbcTemplate(dataSource);
    }
    public StoredProcCall getstoredproc()
    {
    return storedproccall;
    }
    public void setstoredproc(StoredProcCall storedproccall)
        {
        this.storedproccall=storedproccall;
        }
    public void callProc()
    {
    List l=new ArrayList();
    l.add(new SqlParameter("ename",OracleTypes.VARCHAR));
    l.add(new SqlOutParameter("cur",OracleTypes.CURSOR,new RowMapper()
    {
    @Override
        public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
            // TODO Auto-generated method stub
            Map m=new HashMap();
            m.put("empno",arg0.getInt("empno"));
            m.put("ename",arg0.getString("ename"));

            return m;   }}));
Map results=this.jdbcTemplate.call(new StoredProcCall(),l);
results.put("ename","Vivek");
System.out.println(results.get("ename"));}}

StoredProcCallApplication-config.xml

<?xml version="1.0" encoding="UTF-8"?> <beans ---> 
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" > 
 <property name="dataSource" ref="SampleDataSource">
</property> </bean> 

<bean id="SampleDataSource" class="org.apache.commons.dbcp.BasicDataSource" scope="singleton">
 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@servername"/> 
  <property name="username" value="admin" />
   <property name="password" value="admin" /> 
    </bean>
         <bean id="storedproccall" class="Utility.StoredProcCall"> 
           </bean> 
          <bean id="TestClass" class="com.TestCallImpl"> 
      <property name="jdbcTemplate" ref="jdbcTemplate" />
       </bean> </beans>

person raj    schedule 02.05.2011    source источник


Ответы (2)


java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

Вам нужны как Apache Commons DBCP , так и Apache Commons Pool в пути к классам.

Похоже, у вас есть только DBCP.

person skaffman    schedule 02.05.2011
comment
+1 Это проблема, о которой мы, пользователи Maven, никогда не задумываемся (потому что требуемые зависимости извлекаются автоматически) - person Sean Patrick Floyd; 02.05.2011
comment
@Sean: Справедливо, но я не хочу, чтобы мои необходимые зависимости загружались автоматически, я хочу знать, что происходит... - person skaffman; 02.05.2011
comment
вы можете всегда знать, что происходит (исключать зависимости, устанавливать разные версии и т. д.), но вам не обязательно знать, что происходит :-) - person Sean Patrick Floyd; 02.05.2011

Похоже, вам нужно apache commons/dbcp в пути к классам.

<bean id="SampleDataSource" class="org.apache.commons.dbcp.BasicDataSource" ...
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Вот зависимость Maven (при условии, что вы используете Maven):

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
person Sean Patrick Floyd    schedule 02.05.2011
comment
привет, я не использую maven. У меня есть обе банки на моем пути к классам. Это файл s d xml. - person raj; 03.05.2011
comment
‹bean id=jdbcTemplate class=org.springframework.jdbc.core.JdbcTemplate › ‹property name=dataSource ref=DataSource› ‹/property›‹/bean› ‹bean id=DataSource class=org.apache.commons.dbcp.BasicDataSource › ‹имя свойства=driverClassName значение=oracle.jdbc.driver.OracleDriver/› ‹имя свойства=значение URL=jdbc:oracle:thin@server/› ‹имя свойства=значение имени пользователя=ad/›‹имя свойства=значение пароля= ad/›‹/bean›‹bean id=storedproccall class=Utility.StoredProcCall›‹/bean›‹bean id=TestClass class=com.TestCallImpl›‹property name=jdbcTemplate ref=jdbcTemplate/› - person raj; 03.05.2011
comment
@raj это не комментарий. либо добавить к своему вопросу, либо опубликовать новый вопрос - person Sean Patrick Floyd; 03.05.2011