You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:27:03