2014-06-10 140 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控制器。 –