我在整合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的配置?
答案 0 :(得分:0)
如果有人需要答案,我会离开这里,经过几天的突破后我发现了。
在部署应用程序之前,我更改了由Spring Initializr(应用程序一)生成的主类的一些配置,并使其扩展为SpringBootServletInitializer
,因为我遵循了the official spring blog中找到的指南。事实证明这实际上没有必要,因为我从一开始就在Spring Initializr中设置了“WAR”,因此应用程序已经有一个扩展该类的类,因此当它在Tomcat上部署时,Web应用程序启动了两次,所以应用程序配置了两次,并实例化了两个持久性单元。这可能是错误,因为在恢复我对应用程序所做的更改后,一切正常。
TL; DR:如果您使用Spring Initializr创建WAR应用程序,请不要触摸任何内容。