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
}
}
我的豆子:
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
你有个主意吗? 团块
答案 0 :(得分:2)
stacktrace将解释确切的问题,它将在你切断的堆栈跟踪的“嵌套异常是java.l ...”之后的任何内容中。阅读整个错误消息。
如果我猜测,你的DboDao
类在构造函数中有一个空指针异常,因为你指的是尚未设置的字段transactionManager
。
我建议编写这个DboDao
类的单元测试 - 它根本不涉及Spring - 来测试当你调用new DboDao()
时会发生什么。
另外,您可能会发现让DAO类扩展Spring实用程序类JdbcDaoSupport
很方便。
答案 1 :(得分:0)
在构造函数中使用DataSourceTransactionManager时,未设置它。当Spring设置您的上下文时,这将导致NPE。
除了设置JdbcTemplate之外,您可以选择仅依赖注入JdbcTemplate,因为您的事务管理器未被使用。无论出于何种原因,如果您不想配置JdbcTemplate,可以使用init method来构建它(因为它将在Spring提供所有依赖项后调用)。
答案 2 :(得分:0)
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);
}