InvalidDataAccessApiUsageException 和 Write operations are not allowed in read-only mode 解决方法

这些天写webservice,一直在测接口,get方法都没问题,就从昨晚开始测save方法的时候出现了这个错误

Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushM

搜了一下,有这样一种说法

原因一:
这个异常产生的主要原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配上,spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允许的,所以包这个异常

原因二:
在网上搜了一下,其中大多数文章又是提OpenSessionInViewFilter又是提OpenSessionInViewInterceptor的,大多云山雾罩、不知所云。(网上提到OpenSessionInViewFilter,因为缺省分配的Session是FlushMode.NEVER的,所以需要在程序中修改自己期望的Mode。收录这篇文章是因为和前一篇文章有关联。)

其实这个异常的提示还是很明确的:在只读模式下(FlushMode.NEVER/MANUAL)写操作不被允许:把你的Session改成FlushMode.COMMIT/AUTO或者清除事务定义中的readOnly标记。

但是我的配置文件(web.xml)中是有这个的

<init-param>
     <param-name>flushMode</param-name>
     <param-value>AUTO</param-value>
</init-param>

天真啊,加了转义符,开始提示格式错误!! 我了个崩溃啊

Missing value. at character  of

弄了6个+小时没搞清楚咋回事,默默的睡觉去了

早上十点起来继续搞,还是不行,灰心去测一下delete,给的错误提示是这样的:

No message body writer has been found for response class InvalidDataAccessApiUsageException.

我查了InvalidDataAccessApiUsageException这个异常是咋回事,发现还是事务管理的问题,开始让我确定这个bug就是这的错

好吧,以下又尝试了在单独的方法上面加以下,失败了

@Transactional(readOnly = false)

又在spring配置文件里面加以下代码,又失败了。。

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="merge*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="put*" propagation="REQUIRED" />
            <tx:method name="use*" propagation="REQUIRED" />
            <tx:method name="recordOperLog" propagation="REQUIRED" />
            <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 -->
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="count*" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="list*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>

啊啊啊,最后我在BaseDao上加了一句,吼吼,好了!

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW )

总结了一下,想到,就算我在单独方法那写,我调的父方法是BaseDao里面的,还是的治住根本!!

这次长记性了!

你可能感兴趣的:(json,Web,CXF,service)