Spring JDBC NullPointerException
我是第一次在春季发帖的初学者。我相信我已经记下了基本概念,但是当我试图编写自己的代码时,我遇到了一些错误。我做了家庭作业,查看了网站上的其他相关主题,但我仍然没有找到我的代码不起作用的原因 如果我犯了愚蠢的错误,请原谅我。以下是我所有相关的代码片段: DAO接口Spring JDBC NullPointerException,spring,jdbc,Spring,Jdbc,我是第一次在春季发帖的初学者。我相信我已经记下了基本概念,但是当我试图编写自己的代码时,我遇到了一些错误。我做了家庭作业,查看了网站上的其他相关主题,但我仍然没有找到我的代码不起作用的原因 如果我犯了愚蠢的错误,请原谅我。以下是我所有相关的代码片段: DAO接口 public interface TestDAO { public int getId(); } 主SQL连接代码 import javax.sql.DataSource; import org.springframework.
public interface TestDAO {
public int getId();
}
主SQL连接代码
import javax.sql.DataSource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class TestDb extends JdbcDaoSupport implements TestDAO{
private SimpleJdbcTemplate jdbcTemplate;
public int getId()
{
String sql="SELECT DOI.DOI_ID FROM ***.DOI where DOI='test58'";
int id=jdbcTemplate.queryForInt(sql);
return id;
}
public void createTemplate(DataSource dataSource) {
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
}
beans.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="webMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/Form.html">DoiEntry</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean name="DoiEntry" class="com.****.****.DoiEntry">
<property name="eventsService" ref="eventsService"/>
<property name="sendEventsQueueService" ref="sendEventsQueueService"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
<property name="username" value="**USER**" />
<property name="password" value="**PASSWORD**" />
</bean>
<bean id="testDAO" class="com.****.****.TestDAO">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="testDb" class="com.****.****.TestDb">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
我知道这有很多代码需要查看,但是提前感谢您的帮助
Tim您需要使用JdbcDaoSupport提供的JdbcTemplate,而不是在私有字段中使用自己的模板。您可以通过JdbcDaoSupport的getJdbcTemplate()方法访问它 另外,您不能使用jsp:useBean访问Springbean。而是在控制器中调用bean(使用SpringWebMVC)并将结果发送到JSP
在论坛上,他们讨论了一种不用SpringMVC访问bean的方法。将
TestDb.createTemplate(DataSource DataSource)
签名更改为TestDb.setDataSource(DataSource DataSource)
,然后重试。您获得NPE是因为createTemplate方法从未被调用。您需要在DAO上使用此方法:
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
由于必须创建JdbcTemplate的方法从未运行过,因此会出现null指针异常。我猜您的
JdbcTemplate
是null,因为它没有被注入。将不会调用您的createTemplate
方法
您应该使用JdbcDaoSupport
提供的实例。删除createTemplate
方法和jdbcTemplate
实例,并将getId
方法替换为:
public int getId()
{
String sql="SELECT DOI.DOI_ID FROM ***.DOI where DOI='test58'";
int id=getJdbcTemplate().queryForInt(sql);
return id;
}
如果您实际上试图重写父方法,则称之为createJdbcTemplate
或者,完全忘记扩展JdbcDaoSupport
,因为它实际上并没有增加多少功能。相反,您可以将数据源
直接注入到您自己的bean中,并创建模板实例。使用构造函数注入:
public class TestDb {
private final JdbcTemplate template;
public TestDb(DataSource ds) {
template = new JdbcTemplate(ds);
}
}
应用程序上下文中的bean如下所示:
<bean id="testDAO" class="com.****.****.TestDb">
<constructor-arg ref="dataSource" />
</bean>
感谢您的回复。我将代码更改为getJdbcTemplate()方法,但是它仍然不起作用。你还有什么建议吗?你需要提供更多的信息。你还在接受NPE吗?如果是这样,从stacktrace中找出可能为null的内容并进行检查。
public int getId()
{
String sql="SELECT DOI.DOI_ID FROM ***.DOI where DOI='test58'";
int id=getJdbcTemplate().queryForInt(sql);
return id;
}
public class TestDb {
private final JdbcTemplate template;
public TestDb(DataSource ds) {
template = new JdbcTemplate(ds);
}
}
<bean id="testDAO" class="com.****.****.TestDb">
<constructor-arg ref="dataSource" />
</bean>