2009-10-27 24 views
2

,當我讀到有關使用TransactionProxyFactoryBean來從基於配置的服務豆切換到基於註解服務豆

<context:component-scan base-package="tld.mydomain.business"> 
     <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> 
    </context:component-scan> 

和批註我的服務豆@Service(「爲myService」),並認爲偉大的,我會做那是因爲我已經用我的控制器來做這件事了。我平時的服務bean的配置看起來像

<bean id="userService" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean class="tld.mydomain.business.UserServiceImpl"/> 
    </property> 
    <property name="proxyInterfaces" value="tld.mydomain.business.UserService"/> 
    </bean> 

所以現在,我產生他們,我該如何將它們包裝在一個Hibernate代理諸如TransactionProxyFactoryBean來?還是有更好的方法來做到這一點?

我還沒有走完一路,並使用@Repository以及是否需要?

乾杯

回答

4

使用TransactionProxyFactoryBean來沒有現代Spring應用程序鼓勵,但它仍然有效。典型的做法現在是註釋類與@Transactional,然後在你的應用程序上下文文件堅持這個元素:

<tx:annotation-driven transaction-manager="txManager"/> 

這和其他策略discussed在參考文獻中非常深入,甚至還有一個注意事項關於TransactionProxyFactoryBean

+0

非常感謝,我在Spring 2上推薦了一本關於TransactionProxyFactoryBean的書,我現在看到我應該更仔細地檢查過這些文檔。不過,只需要簡單的跟進:這似乎只適用於只有一個事務管理器的情況。不幸的是,我有兩個,因爲我需要與兩個不同的數據庫一起工作。這是使用TransactionProxyFactoryBean沒有問題。表9.2和9.3似乎並不建議我可以 – niklassaers 2009-10-27 19:41:34

+0

嗯,當我這樣做時,我在訪問我的服務時遇到以下異常:org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean名爲'org.springframework.transaction.interceptor .TransactionInterceptor#0'必須是[org.aopalliance.aop.Advice]類型,但實際上是[org.springframework.transaction.interceptor.TransactionInterceptor]類型 – niklassaers 2009-10-27 20:10:09

+0

它可能是@Service(「myService」)和@交易註釋衝突? – niklassaers 2009-10-27 20:37:00

1

沒有必要對

<context:include-filter type="annotation"expression="org.springframework.stereotype.Service"/>

Spring將註冊@Service, @Repository, @Component...一旦他們在基礎包中找到。

Like @Rob表示要麼使用@Transactional要麼使用<aop:config>...</aop:config>來處理服務級別的事務。

+0

感謝您的提示,我已經刪除了額外的混亂。你有什麼建議,爲什麼我得到上面的BeanNotOfRequiredTypeException異常?或者如何處理多個事務管理器?我從文檔中看到,我可以使用給出不同的建議,但在我看來,這仍然只存在於一個事務管理器中? – niklassaers 2009-10-27 20:28:38

+0

通常'BeanNotOfRequiredType'當你注入一個錯誤類型的bean時,除非你發佈堆棧跟蹤,否則我不能進一步說話。那麼你只需要1個'PlatformTransactionManager',除非你有2個'DataSource',否則不需要2個。 – 2009-10-29 15:50:04

1

如果您有兩個不同的資源需要在同一個事務中,那麼您將需要使用JTA。查看我對前面問題here的回答。你的配置需要看起來像:

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManagerName" value="appserver/jndi/path" /> 
</bean> 

appserver/jndi/path需要使用隨您的應用程序服務器(儘管你可以使用一個獨立的JTA事務管理器,如JTA事務管理器的JNDI路徑被替換JOTM)。如在2.5.x API提到典型路徑是:

  • 的 「java:COMP/UserTransaction的」 爲樹脂2.x的,甲骨文OC4J(獵戶)納斯(JOTM),BEA的WebLogic
  • 的「java:COMP /事務管理「對於Resin 3。X
  • 的 「java:應用服務器/事務管理」 爲GlassFish的
  • 的 「java:PM /事務管理」 爲Borland Enterprise Server和太陽應用服務器(的Sun ONE 7或更高版本)
  • 的 「java:/事務管理」 爲JBoss應用程序服務器
+0

嗨工具包,非常感謝您的意見。當我使用TransactionProxyFactoryBean時,我已經能夠解決它,因爲它並不是必須將它們保留在同一個事務中,我也可以有兩個,其中一個是隻讀的。這就是爲什麼我問到說什麼交易去哪裏。將它們合併成一個似乎是最好的主意。但都是JDBC連接,我沒有使用JNDI。但是我會在早上讀你的建議(現在是午夜)Cheers-Nik – niklassaers 2009-10-27 23:21:17