【问题标题】:spring jdbcdaosupport returns nullspring jdbcdaosupport 返回 null
【发布时间】:2015-06-12 20:11:01
【问题描述】:

我搜索了网络的每个角落,但没有结果。 我正在使用 Spring 并尝试将 Jdbc 操作注入到我的 DaoImpl 类中。

似乎我错过了一些东西,因为 DaoImpl 类在查询某些东西时返回 null,我做错了什么?

Bean 配置:

 <bean id="transactionDao" class="jdbc.dao.OracleTransactionDao">
            <property name="jdbcTemplate" ref="jdbcTemplate" />
        </bean>

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource" />
        </bean>


        <!-- ORACLE CONNECTION -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="${url}" />
            <property name="username" value="${dbname}" />
            <property name="password" value="${dbpassword}" />
        </bean>

接口道:

interface TransactionDao extends Serializable {
    public abstract void insert (Transaction transaction);

正如您在 bean 配置和下面的此类中看到的那样,我目前正在尝试注入 JdbcTemplate 并尝试使用 JdbcDaoSupport 的扩展方法 实施道:

OracleTransactionDao extends JdbcDaoSupport implements
TransactionDao {
    @Autowired
    JdbcTemplate              template;

    @Override
    public void insert (Transaction transaction) {
        List<Map<String, Object>> list;
        try{
            list = template
                    .queryForList("SELECT * FROM CUSTOMER");
        }catch(NullPointerException e) {
            list = this.queryForList("SELECT * FROM CUSTOMER");
        }
        System.out.println("called insert" + list.size());

    }

我的主要: ClassPathXmlApplicationContext 上下文 = 新 ClassPathXmlApplicationContext( “beanConfigs.xml”); context.registerShutdownHook(); OracleTransactionDao dao = (OracleTransactionDao) 上下文 .getBean("transactionDao");

我一定是遗漏了一些细节吗?

提前致谢!

【问题讨论】:

  • 请将 driverName 设置为 "oracle.jdbc.OracleDriver" 看看是否有效
  • 驱动程序在 main 中工作,所以我不认为它是驱动程序。它与将 jdbctemplate 注入到我的 DaoObj 中有关,我现在找到了一种解决方法,注入上下文到 DaoObj,然后在我的 DaoObjImpl 中安装一个静态 jdbctemplate,驱动程序没有抱怨。谢谢
  • 这很奇怪,因为我已经为您的场景创建了单元测试并且它有效
  • 唯一的区别是你安装的驱动程序?

标签: spring jdbc dao jdbctemplate


【解决方案1】:

我在评论中提到的单元测试。 spring-context.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" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">


  <bean id="transactionDao" class="jdbc.dao.TransactionDao">
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <jdbc:embedded-database id="dataSource" type="H2" />

</beans>

TransactionDao:

public class TransactionDao extends JdbcDaoSupport {
    @Autowired
    private JdbcTemplate template;

    public List<Map<String, Object>> insert() {
        String sql = "CREATE TABLE REGISTRATION " +
                "(id INTEGER not NULL, " +
                " first VARCHAR(255), " +
                " last VARCHAR(255), " +
                " age INTEGER, " +
                " PRIMARY KEY ( id ))";

        template.execute(sql);
        return template.queryForList("select * from registration");
    }
}

TransactionDaoTest:

@ContextConfiguration(locations = {"classpath*:spring-context.xml"})
public class TransactionDaoTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private TransactionDao transactionDao;

    @Test
    public void testJdbcTemplateNotNull(){
        Assertions.assertThat(transactionDao.insert()).isNotNull();
    }
}

pom.xml(不需要一些dep):

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-framework-bom</artifactId>
        <version>4.1.6.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.3</version>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>18.0</version>
    </dependency>

    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.9.4</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>3.0.0</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>


    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.4.187</version>
      <scope>test</scope>
    </dependency>



  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

【讨论】:

  • 是的,但是你必须考虑到这仍然在同一个上下文中,你的测试,我在从 main 调用它时也可以工作,但是添加一些 JMS EJB 侦听器和异步消息在,我认为发生了什么是线程,因为主线程在 messageListener 调用 DaoObj 之前退出,当在 DaoObj 中 JdbcTemplate 为空时,正如我所提到的,当将上下文注入 DaoObj 并使其成为 ApplicationContextAware 时,我也有它有效,但我想相信有更好的方法来做到这一点?
  • 我的猜测是这个类没有被 Spring 实例化。检查它的最简单方法是在 TransactionDao 中放置一个断点并查看堆栈跟踪 - 确保它由 Spring 运行
  • 那会是什么原因?
【解决方案2】:

基本上是通过将上下文注入 OracleTransactionDao 来解决这个问题

OracleTransactionDao implements TransactionDao,
          ApplicationContextAware {
    private static JdbcOperations jdbc;

    @Override
    public void setApplicationContext (ApplicationContext context) {
        this.jdbc = context.getBean(JdbcOperations.class);
    }

我必须在 beanConfig 中添加所有内容

<bean id="transactionDao" class="jdbc.dao.OracleTransactionDao">
</bean>

如果有人有更好的解决方案,请告知

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2013-07-02
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多