Play2.3.X项目Scala报错Cannot resolve overloaded method 'withTransaction'解决办法
问题原因
Play 2.3.x 中 play.db.jpa.JPA 提供的Scala版 withTransaction 方法的重载签名和你使用的Java API写法不匹配,你当前的写法混淆了Java和Scala的API调用规则:
- 你传入的
JPA.em => { ... }是Java API的lambda写法,Scala版withTransaction不需要你显式传入em作为参数 JPA.em方法只能在已经开启的事务上下文中调用,不能作为参数传递给withTransaction
解决方案
修改onGet方法里的withTransaction调用写法,两种可选:
写法1:直接在代码块内调用JPA.em
def onGet() { import play.db.jpa.JPA Logger.info("Connection start"); JPA.withTransaction { val resultsList = JPA.em.createNamedQuery("findCity").setParameter("name", "Boston").getResultList // 后续处理resultsList的逻辑 } }
写法2:显式获取EntityManager参数
如果你需要明确声明em变量,也可以用这种写法:
def onGet() { import play.db.jpa.JPA Logger.info("Connection start"); JPA.withTransaction { em => val resultsList = em.createNamedQuery("findCity").setParameter("name", "Boston").getResultList // 后续处理resultsList的逻辑 } }
额外注意点
- 确保你的
build.sbt中已经正确引入了Play JPA依赖:javaJpa - 确保
application.conf中已经配置了正确的JPA持久化单元,并且开启了JPA支持 - Play 2.3.x的Global对象默认需要继承
GlobalSettings才能被框架识别,你当前的Global对象没有继承的话,goBootstrap方法不会被自动调用,需要修改为object Global extends GlobalSettings,并且把启动方法名改为onStart才能在项目启动时自动执行逻辑。
内容的提问来源于stack exchange,提问作者Jonio
相关产品推荐
相关产品推荐

