2015-06-12 5 views
0

Я искал в каждом уголке Интернета без результата. Я использую Spring и пытаюсь ввести Jdbc-операции в класс DaoImpl.spring jdbcdaosupport возвращает null

Похоже, что у меня что-то отсутствует, поскольку класс 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); 

Как вы можете видеть в боба конфигурации, и в этом классе ниже, я в настоящее время оба пытаются впрыснуть JdbcTemplate и пытаясь использовать расширенные методы JdbcDaoSupport Реализация dao:

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()); 

    } 

My main: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ( "beanConfigs.xml"); context.registerShutdownHook(); OracleTransactionDao dao = (OracleTransactionDao) контекст .getBean ("transactionDao");

Возможно, мне не хватает информации о нем?

Заранее благодарен!

+0

Пожалуйста, установите DriverName к «Оракул .jdbc.OracleDriver "и посмотреть, работает ли он – rgrebski

+0

Драйвер работает в основном, поэтому я не думаю, что его драйвер .. Его что-то с введением jdbctemplate в мой DaoObj, я нашел обходное решение на данный момент, вводя контекст в DaoObj, а затем insta sating статический jdbctemplate внутри моего DaoObjImpl, и драйвер не жалуется .. Спасибо – MRK187

+0

Thats weird, потому что я создал модульный тест для вашего сценария, и он работает – rgrebski

ответ

0

Единичный тест, упомянутый в комментарии. весна-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 (некоторые Deps не нужны):

<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> 
+0

Да, но вы должны принять во внимание, что это все еще в одном контексте, ваш тест, У меня тоже есть работа, когда вы вызываете его из основного, но добавляете слушателей JMS EJB и входящие сообщения асинхронных сообщений, Что происходит? думаю, это потоковая передача, так как главный поток выходит до того, как messageListener вызывает DaoObj, когда в DaoObj JdbcTemplate является нулевым, как я уже упоминал, при введении контекста в DaoObj и создании приложения ApplicationContextAware, у меня также есть работа, но я хотелось бы верить, что есть лучший способ сделать это? – MRK187

+0

Я предполагаю, что этот класс не создан Spring. Самый простой способ проверить, что это поставить точку останова в вашем TransactionDao и увидеть stacktrace - убедитесь, что его запустить весной – rgrebski

+0

И что было бы причиной этого? – MRK187

0

В основном пришел arou го этот вопрос, вводя контекст в 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> 

Если кто лучше выглядит решение, пожалуйста, сообщите

Смежные вопросы