2014-06-10 139 views
0

我正在使用JavaFX的Spring 3.2.4並希望實現一種方法,其中操作將在事務中執行。我在控制器代碼如下所示:春季交易註釋不起作用

@Transactional(rollbackFor = { ServiceException.class, 
      ValidationException.class }) 
    public void registerVolunteer(User user, Volunteer volunteer) 
      throws ServiceException, ValidationException { 
     User ret = userService.create(user); 
     volunteer.setUser(ret); 
     volunteerService.untransactedCreate(volunteer); 
    } 

我的應用上下文:

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

    <!-- Transaction Manager --> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

試圖運行它,我得到這個錯誤信息:

Controller method "onBackClicked" not found. 
/home/workspace/project/NewProject/target/classes/fxml/RegisterVolunteer.fxml:69 
    at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:497) 
    at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:594) 
    at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2472) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2177) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2069) 
    at org.impactvolunteers.management.FXMLSpringLoader.load(FXMLSpringLoader.java:97) 
    at org.impactvolunteers.management.FXMLSpringLoader.load(FXMLSpringLoader.java:81) 
    at org.impactvolunteers.management.gui.Screen.init(Screen.java:50) 
    at org.impactvolunteers.management.gui.ScreensController.init(ScreensController.java:43) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    ... 

的方法存在。通過刪除註釋或將方法從public更改爲private或從配置中刪除bean,程序將運行,但@Transactional -annotation根本不起作用。刪除proxy-target-class="true"導致我另一個錯誤。

+0

您的錯誤消息與交易註釋無關。你可能會注意到你的棧跟蹤中根本沒有引用Spring應用程序上下文。只有當您的服務沒有實現接口時,才需要使用CGLIB代理目標類。您的例外是說JavaFX找不到控制器方法。那個控制器用'@ Controller'註釋,並且你的Spring XML中是否有'? – JamesENL

+0

我將該方法移至單獨的服務類,並解決了此問題。我沒有這兩個,因爲我正在開發一個使用JavaFX的本機應用程序,而我沒有使用MVC。錯誤消息與註釋無關,但將方法從公共更改爲私有刪除了錯誤消息,這對我來說顯得很奇怪,但我並不十分了解Spring的具體情況,所以... –

回答

1

如果你正在談論@Transactional那麼它用於回滾當前事務發生。

這主要是在測驗的情況下使用,讓我告訴你:

RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration("file:src/main/webapp/WEB-INF/dispatcher-servlet.xml") 
@TransactionConfiguration(transactionManager = "txManager",defaultRollback = true) 
@Transactional 
public class AddVendorProcessorTest{ 

    // Your code 
} 

現在在這裏@TransactionConfiguration需要transactionManager從這裏,一個XML文件:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver"/> 
    <property name="url" value="jdbc:postgresql://localhost:5432/db"/> 
    <property name="username" value="postgres"/> 
    <property name="password" value="pwd"/> 
    <property name="validationQuery" value="SELECT 1"/> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="com.domain"/> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.generate_statistics">true</prop> 
     </props> 
    </property> 
</bean> 

<!-- Transaction Manager --> 
<bean id="txManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

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

它會自動獲得txManager bean。

如果有任何查詢仍然POST我。

+0

再次,我不是使用MVC。控制器在我的情況下意味着JavaFX控制器。 –