Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JDBC NullPointerException_Spring_Jdbc - Fatal编程技术网

Spring JDBC NullPointerException

Spring JDBC NullPointerException,spring,jdbc,Spring,Jdbc,我是第一次在春季发帖的初学者。我相信我已经记下了基本概念,但是当我试图编写自己的代码时,我遇到了一些错误。我做了家庭作业,查看了网站上的其他相关主题,但我仍然没有找到我的代码不起作用的原因 如果我犯了愚蠢的错误,请原谅我。以下是我所有相关的代码片段: DAO接口 public interface TestDAO { public int getId(); } 主SQL连接代码 import javax.sql.DataSource; import org.springframework.

我是第一次在春季发帖的初学者。我相信我已经记下了基本概念,但是当我试图编写自己的代码时,我遇到了一些错误。我做了家庭作业,查看了网站上的其他相关主题,但我仍然没有找到我的代码不起作用的原因

如果我犯了愚蠢的错误,请原谅我。以下是我所有相关的代码片段:

DAO接口

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>