Vaadin和JPARepository:交易错误

时间:2015-05-11 13:01:05

标签: java spring-boot vaadin spring-data-jpa vaadin7

我在整合Vaadin和spring-data(尤其是JPAReposit)方面遇到了麻烦。

在遵循Vaadin团队最后一次网络研讨会的指导后,我设法使用Spring starter(spring boot)配置我的应用程序,添加了Vaadin,JPA和Postgresql数据库。使用此方法非常简单,只需使用此

即可将实体加载到表格中
@Autowired private ProjectDAO projects;

// other code here ...
grid.setContainerDataSource(new BeanItemContainer<Project>(Project.class, projects.findAll()));

我的存储库只是

@Repository
public class ProjectDAO implements JPARepository<Project, Long> {

}

而且,正如我所说,这完美无瑕。问题是当我尝试保存某些东西时:通过点击按钮来尝试保存项目时,例如

btnSave.addClickListener(e -> saveCurrent());

private void saveCurrent() {
// ... here I do some filesystem operations, nothing that requires DB connection
    setModified();
}

public void setModified() {
    project.setLastAccess(new Date());
    projects.saveAndFlush(project);
}

我得到一个例外:

org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress.

我尝试过很多不同的事情,例如将setModified方法标记为@Transactional,或将setModified封装到服务类中,但所有内容都会抛出此异常。

我觉得这很奇怪,这不起作用,开箱即用,我宁愿不自己处理交易,因为已经有了这样做的工具

任何帮助都会非常感激

编辑12/05/2015

似乎只有在使用外部服务器时才会出现此问题,而不是spring-boot提供的嵌入式服务器。出于测试目的,我可以设法使用内置的,但最终我将不得不在现有服务器上部署应用程序,那么问题是什么呢? Tomcat的配置?

1 个答案:

答案 0 :(得分:0)

如果有人需要答案,我会离开这里,经过几天的突破后我发现了。

在部署应用程序之前,我更改了由Spring Initializr(应用程序一)生成的主类的一些配置,并使其扩展为SpringBootServletInitializer,因为我遵循了the official spring blog中找到的指南。事实证明这实际上没有必要,因为我从一开始就在Spring Initializr中设置了“WAR”,因此应用程序已经有一个扩展该类的类,因此当它在Tomcat上部署时,Web应用程序启动了两次,所以应用程序配置了两次,并实例化了两个持久性单元。这可能是错误,因为在恢复我对应用程序所做的更改后,一切正常。

TL; DR:如果您使用Spring Initializr创建WAR应用程序,请不要触摸任何内容。