【问题标题】:Error creating bean with name '..' defined in file ..xml创建文件 ..xml 中定义的名称为“..”的 bean 时出错
【发布时间】:2012-08-29 02:54:48
【问题描述】:

你能帮帮我吗? 1.我的道

package user.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import user.domain.DboBean;

public class DboDao {
    private DataSourceTransactionManager transactionManager;
    private JdbcTemplate jdbcTemplate;

    public DboDao() {
        // TODO Auto-generated constructor stub
        super();
        DataSource datatSource = transactionManager.getDataSource();
        jdbcTemplate = new JdbcTemplate(datatSource);
    }

//Spring setter injector used
public void setTransactionManager(DataSourceTransactionManager transactionManager){
    this.transactionManager = transactionManager;
}


public DboBean read() {//String dboId
    // TODO Auto-generated method stub
    String sql = "SELECT ins_ID, ins_name FROM da_tracking "
            + "WHERE ins_ID = 3";
    final Object[] params = new Object[] {};//dboId

    //Creating object being queried
    final DboBean dboBean = new DboBean();      
    //Process query Results
    jdbcTemplate.query(sql, params, new RowCallbackHandler(){
        public void processRow(ResultSet rs) throws SQLException{
            dboBean.setDboId(rs.getString("dboId"));    
        }

    });
    return dboBean;//returns queried objects
}
}


2. 我的豆子:

 package user.domain;

 public class DboBean {

    private String dboId;
    private String dboDevName;

    public DboBean(){
        this.setDboId(dboId);
        this.setDboDevName(dboDevName);     
    }

    public String getDboId() {
        return dboId;
    }

    public void setDboId(String dboId) {
        this.dboId = dboId;
    }

    public String getDboDevName() {
        return dboDevName;
    }

    public void setDboDevName(String dboDevName) {
        this.dboDevName = dboDevName;
    }
 }

我的春天:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd">

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
    <property name="url"
        value="jdbc:jtds:sqlserver://localhost:1433;databaseName=XYDB" />
    <property name="username" value="user" />
    <property name="password" value="xyz" />            
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="objDbo" class="user.dao.impl.DboDao">
    <property name="transactionManager" ref="transactionManager" />
</bean>

</beans> 

还有我的 Junit:

package user.dao.JUnitTest;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.apache.log4j.xml.DOMConfigurator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import java.lang.Object;

import user.dao.impl.DboDao;
import user.domain.DboBean;


public class JUnitDaoTest extends TestCase {
private static final String OID = "dboId";
private static final String DDN = "dboDevName";
protected static ApplicationContext appContext;
private DboDao objDao;

public JUnitDaoTest(String arg) {
    super(arg);
}

public static Test suite(){
    TestSuite suite = new TestSuite();
    suite.addTest(new JUnitDaoTest("testDboDAO"));
    return suite;       
}

public void setUp() throws Exception{
    init();
    objDao =  (DboDao) getBean("objDao");
}

public static void main(String[] args){
    junit.textui.TestRunner.run(suite());
}
//@Override
public synchronized void init(){
    if (appContext == null){
        try{
            String path = System.getProperty("user.dir");
            String slash = System.getProperty("file.separator");

            String configDir = path + slash + "config" + slash;
            DOMConfigurator.configure(configDir +  "log4j.xml");

            appContext = new FileSystemXmlApplicationContext(new String[] {configDir + "appContext.xml"});
        }catch(Exception e){
            System.err.println(e.getMessage());
        }
    }
}

protected Object getBean(String beanName){
    return appContext.getBean(beanName);
}


public void testDboDAO(){
    DboBean record = new DboBean();
    record.setDboId(OID);//setDboId(dboId);
    record.setDboDevName(DDN);



    DboBean bean = objDao.read();
    assertEquals(DDN, bean.getDboDevName());
    System.out.println("User selected [" + bean.getDboId() + ", " + bean.getDboDevName() + 
            "]");

    //objDao.delete(dboId);
    //bean = objDao.read(dboId);
    //assertEquals(null, bean.getDboDevName());
    //System.out.println("User is deleted [" + bean.getDboId() + ", " + bean.getDboDevName() + 
        //  "]");

}

}

我收到此错误: 创建文件 [...\config\appContext.xml] 中定义的名称为“objDbo”的 bean 时出错:bean 的实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [user.dao.impl.DboDao]:构造函数抛出异常;嵌套异常是 java.l

你有什么想法吗? 斑点

【问题讨论】:

    标签: java spring


    【解决方案1】:

    堆栈跟踪将解释确切的问题,它将出现在您切断的堆栈跟踪的“嵌套异常是 java.l...”部分之后。阅读整个错误消息。

    如果我猜测一下,您的 DboDao 类在构造函数中有一个空指针异常,因为您指的是尚未设置的字段 transactionManager

    我建议编写这个DboDao 类的单元测试——它根本不涉及Spring——来测试调用new DboDao() 时会发生什么。

    此外,您可能会发现让您的 DAO 类扩展 Spring 实用程序类 JdbcDaoSupport 很方便。

    【讨论】:

    • Sorry..' 嵌套异常是 java.lang.NullPointerException'
    • 对 - 所以问题是你的类的构造函数中有一个 NullPointerException 。您发布的构造函数将永远无法工作,并且总是会抛出 NPE。
    【解决方案2】:

    您的 DataSourceTransactionManager 在构造函数中使用时未设置。当 Spring 设置您的上下文时,这将导致 NPE。

    您也可以只依赖注入 JdbcTemplate,因为您的事务管理器除了设置 JdbcTemplate 外没有被使用。如果出于某种原因,您不想配置 JdbcTemplate,则可以使用 init method 来构建它(因为它将在 Spring 提供所有依赖项后调用)。

    【讨论】:

      【解决方案3】:
      public class DboDao {
      private DataSourceTransactionManager transactionManager;
      private JdbcTemplate jdbcTemplate;
      
      public DboDao() {
          // TODO Auto-generated constructor stub
          super();
          // problem exists here, as transactionManager is not set yet and
          // you are using Setter Based injection so `NPE`
          // you can move this code in setter method of transactionManager, to make it work. 
          DataSource datatSource = transactionManager.getDataSource(); 
          jdbcTemplate = new JdbcTemplate(datatSource);
      }.............
      

      另外,我在您的代码中看到了错误的内容。在服务层使用事务管理器。并在 DboDao 中注入 dataSource。并创建 jdbcTemplate 如下:

      public class DboDao {
      private DataSource dataSource;  // either use @Autowire or provide xml config
      private JdbcTemplate jdbcTemplate;
      
      public DboDao() {        
          super();        
      }
      ....// getter and setter for jdbcTemplate and dataSource
      
      public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
          jdbcTemplate = new JdbcTemplate(dataSource);
      }
      

      查看您的配置文件,如果您想让您的应用运行:在 setter 方法中初始化 dataSource 和 jdbcTemplate,因为您使用的是基于 setter 的注入。

      public class DboDao {
          private DataSourceTransactionManager transactionManager;
          private JdbcTemplate jdbcTemplate;
      
          public DboDao() {
              super();            
          }
      
      //Spring setter injector used
      public void setTransactionManager(DataSourceTransactionManager transactionManager){
          this.transactionManager = transactionManager;
          // moved code from constructor
          DataSource datatSource = transactionManager.getDataSource(); 
          jdbcTemplate = new JdbcTemplate(datatSource);
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-24
        • 2020-09-15
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多