spring配置 no matching editors or conversion strategy found 異常解決方案
spring 配置中遇到該問題,可以通過注入的方式解決,程式碼如下:
<tx:annotation-driven transaction-manager="myTxManager" proxy-target-class="true"/>
總結:Spring注入的是介面,關聯的是實現類。 這裡注入了實現類,所以報異常了。
另外一種方法:
由於預設是注入介面。所以
在Spring的配置檔案中在<aop:config></aop:config>中加入“proxy-target-class="true" ”,表示可以用類注入,即:
<aop:config proxy-target-class="true"></aop:config>
<aop:config proxy-target-class="true">
<aop:pointcut id="daoOperation" expression="execution(* com.yg.ordertiket.dao.*.*(..))"/>
<aop:advisor advice-ref="txManager" pointcut-ref="daoOperation"/>
</aop:config>
Write operations are not allowed in read-only mode (FlushMode.NEVER) 錯誤解決
沒有配置事務管理,
錯誤程式碼:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
錯誤原因:
OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設為FlushMode.NEVER。然後把該sessionFactory繫結到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過後再接除該sessionFactory的繫結,最後closeSessionIfNecessary根據該session是否已和transaction繫結來決定是否關閉session。在這個過程中,若HibernateTemplate 發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫許可權。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉為Flush.AUTO,擁有insert,update,delete操作許可權,如果沒有transaction,並且沒有另外人為地設flush model的話,則doFilter的整個過程都是Flush.NEVER。所以受transaction保護的方法有寫許可權,沒受保護的則沒有。
解決辦法:
採用spring的事務宣告,使方法受transaction控制
<bean id="baseTransaction"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
//採用 log4j來完成除錯時的日誌功能
private static Log log = LogFactory.getLog(NewsDAOHibernate.class);
//以私有的成員變數來儲存 SessionFactory。
private SessionFactory sessionFactory;
//以私有變數的方式儲存 HibernateTemplate
private HibernateTemplate hibernateTemplate = null;
//設值注入 SessionFactory必需的 setter方法