1. 程式人生 > >spring配置 no matching editors or conversion strategy found 異常解決方案

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方法