Java org.springframework.dao.InvalidDataAccessApiUsageException:只读模式下不允许执行写入操作
我是SSH新手,使用的是Spring4、Hibernate4和Struts2。 当我为一个DAO类创建一个单元测试时,我遇到了这个异常Java org.springframework.dao.InvalidDataAccessApiUsageException:只读模式下不允许执行写入操作,java,spring,hibernate,ssh,Java,Spring,Hibernate,Ssh,我是SSH新手,使用的是Spring4、Hibernate4和Struts2。 当我为一个DAO类创建一个单元测试时,我遇到了这个异常 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"}) public class UserDaoTest { @Test public void testAddUserN
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"})
public class UserDaoTest {
@Test
public void testAddUserNotExists() {
User user = new User("20116524", "785ee107c11dfe36de668b1ae7baacbb");
userDao.addUser(user);
assertNotNull(userDao.getUserByUsername("20116524"));
}
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* UserDao object to test.
*/
private UserDao userDao;
}
我试图在web.xml中添加以下行,但不起作用
参考:
我相信我的applicationContext.xml有问题,以下是内容:
<!-- Session Factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>emis.accounts.model</value>
</list>
</property>
</bean>
<!-- Transaction -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
不过,我还有一个例外:
WARNING: Exception thrown from ApplicationListener handling ContextClosedEvent
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Thu Mar 20 13:53:51 CST 2014]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:346)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:333)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:880)
...
WARNING: Exception thrown from LifecycleProcessor on context close
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Thu Mar 20 13:53:51 CST 2014]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:359)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:888)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:841)
...
我该怎么办?有人能帮我吗?非常感谢 首先,决定要使用什么进行交易。XML配置或注释@Transactional。不要试图把两者都混在一起 如果使用@Transactional,请确保使用正确的注释对UserDao进行注释
如果使用XML,请确保tx:advice中的顺序正确。目前所有内容都是只读的。第一场比赛获胜,因为你有一个通配符*在上面,所有东西都将匹配该切入点。接下来,您不需要,因为您已经用一个块声明了您的方面 在web.xml中添加内容应该如何帮助您的单元测试,因为您不知道存在web.xml。你能发布完整的测试用例、hibernate.cfg.xml和UserDao的内容吗。只有您的意思是在方法中添加@TransactionalreadOnly=false?我做了,但我得到了另一个例外:无法自动连接方法:public void emis.accounts.dao.UserDaoTest.setUserDaoemis.accounts.dao.UserDao;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到依赖项类型为[emis.accounts.dao.UserDao]的符合条件的bean:应至少有1个bean符合此依赖项的autowire候选项的条件。依赖项注释:{}然后修复该问题。我猜想UserDao是一个具体的类,它实现了一些接口。默认情况下,Spring使用基于接口的JDK动态代理。将代理目标类添加到您的,以强制基于类的代理。
WARNING: Exception thrown from ApplicationListener handling ContextClosedEvent
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Thu Mar 20 13:53:51 CST 2014]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:346)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:333)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:880)
...
WARNING: Exception thrown from LifecycleProcessor on context close
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Thu Mar 20 13:53:51 CST 2014]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:359)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:888)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:841)
...