以下摘自 XML 应用程序上下文定义的摘录显示了我如何在其上调整 JDBC DataSource
和休眠SessionFactory
:
<context:component-scan base-package="com.phoneBook.dao" />
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5432/postgres?currentSchema=phoneBook" />
<property name="username" value="postgres" />
<property name="password" value="a1f10g" />
<property name="initialSize" value="20" />
<property name="maxActive" value="100"/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.PostgreSQL94Dialect
</value>
</property>
<property name="annotatedClasses">
<list>
<value>com.phoneBook.model.Address</value>
<value>com.phoneBook.model.Contact</value>
<value>com.phoneBook.model.User</value>
<value>com.phoneBook.model.Lang</value>
</list>
</property>
</bean>
<bean id="myProductDao" class="com.phoneBook.dao.Impl.AddressDaoImpl">
<property name="sessionFactoryBean" ref="mySessionFactory"/>
</bean>
基于这个上下文,我创建了我的DAO类,其中一部分如下所示
package com.phoneBook.dao.Impl;
@Repository
public class AddressDaoImpl implements AddressDao{
private Session currentSession;
private Transaction currentTransaction;
private LocalSessionFactoryBean sessionFactoryBean;
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return (SessionFactory) sessionFactoryBean.getObject();
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public LocalSessionFactoryBean getSessionFactoryBean() {
return sessionFactoryBean;
}
public void setSessionFactoryBean(LocalSessionFactoryBean sessionFactoryBean) {
this.sessionFactoryBean = sessionFactoryBean;
}
但是当我运行我的测试时,我有 NPE,有人可以解释我做错了什么吗
@Test
public void addressTest(){
AddressDaoImpl addressDao = new AddressDaoImpl();
try {
addressDao.openSessionWithTransaction();
System.out.print(addressDao.findById(1).toString());
addressDao.openSessionWithTransaction();
} catch (DataBaseException e) {
addressDao.closeSessionWithTransaction();
e.printStackTrace();
}
你必须在测试用例中自动连接 AddressDaoImpl:
@Test
public void addressTest(){
@Autowired
AddressDaoImpl addressDao
或者更好地使用界面:
@Test
public void addressTest(){
@Autowired
AddressDao addressDao
不要忘记使用以下方法运行测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:<your configuration>")
因为自动wiering仅适用于容器管理的Bean,而不适用于使用new
关键字创建Bean的情况。