我正在研究在Swing应用程序上使用Spring的可能性,并应用MVC概念。
现在,我正在尝试创建一个@ transaction方法,但它不会启动事务。
这是我的密码:
@Component
public class MainFormController {
@Autowired
private MainFormFrameView view;
@Autowired
private MyService service;
public MainFormController() {
view.button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doSomethingInTransaction();
}
});
}
@Transactional
public void doSomethingInTransaction() {
if (!TransactionSynchronizationManager.isActualTransactionActive()) {
throw new IllegalStateException("No active transaction!!!!");
}
service.doSomethingOverTheTransaction();
}
}这是我的配置:
@Configuration
@ComponentScan(basePackages = "br.com.jjw.pdv")
@EnableTransactionManagement
public class AppContextConfiguration {
@Bean
public DataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource ret = new ComboPooledDataSource();
ret.setDriverClass(jdbcDriver.class.getName());
ret.setJdbcUrl("jdbc:hsqldb:file:dados.hsql");
ret.setUser("sa");
ret.setPassword("");
return ret;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws PropertyVetoException {
LocalContainerEntityManagerFactoryBean ret = new LocalContainerEntityManagerFactoryBean();
ret.setDataSource(dataSource());
ret.setJpaDialect(jpaDialect());
EclipseLinkJpaVendorAdapter adapter = new EclipseLinkJpaVendorAdapter();
adapter.setDatabase(Database.HSQL);
ret.setJpaVendorAdapter(adapter);
ret.setPersistenceXmlLocation("classpath:META-INF/persistence.xml");
ret.setPersistenceUnitName("jjw-pdv-unit");
ret.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
return ret;
}
@Bean
public JpaDialect jpaDialect() {
return new EclipseLinkJpaDialect();
}
@Bean
public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
return new PersistenceAnnotationBeanPostProcessor();
}
@Bean
public JpaTransactionManager transactionManager() throws PropertyVetoException {
JpaTransactionManager ret = new JpaTransactionManager();
ret.setEntityManagerFactory(entityManagerFactory().getNativeEntityManagerFactory());
ret.setJpaDialect(jpaDialect());
return ret;
}
}单击该按钮时,doSomethingInTransaction()方法将引发异常:
IllegalStateException("No active transaction!!!!");为什么?
发布于 2014-03-20 11:55:27
Spring AOP是基于代理的,内部调用是不建议的。
您需要对spring提供的代理进行调用,如下所示
SomeTransactionalBean bean =
applicationContext.getBean(SomeTransactionalBean.class);
bean.doSomethingInTrasanction();例如,将@Transactional注释放在服务方法上。
https://stackoverflow.com/questions/22531728
复制相似问题