如何在Play 2.7中查看嵌入式H2数据库内容?含认证问题求助
我来帮你搞定在Play 2.7里查看嵌入式H2数据库内容的问题,顺便解决你遇到的认证报错:
一、正确查看嵌入式H2内存库的步骤
嵌入式H2内存数据库是依附于Play应用的JVM进程存在的,所以必须让H2浏览器和应用运行在同一个进程里才能访问到它——分开跑sbt run和sbt h2-browser是行不通的,因为它们是两个独立进程。下面是两种靠谱的方法:
方法1:通过Play控制器启动H2浏览器
这种方式最直观,步骤如下:
- 在项目里新建一个控制器类,用来启动H2的Web浏览器:
import org.h2.tools.Server import play.api.mvc.{Action, ControllerComponents} import javax.inject._ @Singleton class H2ConsoleController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { def launch = Action { // 启动H2 Web浏览器,端口设为8082(可自定义) Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start() Ok("H2浏览器已启动,请访问 http://localhost:8082") } }
- 在
conf/routes文件中添加对应的路由:
GET /h2-console controllers.H2ConsoleController.launch
- 启动Play应用(执行
sbt run),待应用完全启动后,访问http://localhost:9000/h2-console(假设Play默认端口是9000),会看到H2浏览器启动提示。 - 打开
http://localhost:8082,在H2登录界面填写连接信息:- JDBC URL:
jdbc:h2:mem:play(和配置文件保持一致) - 用户名:
sa - 密码:留空
- JDBC URL:
方法2:在sbt中同进程启动应用和H2浏览器
如果你不想新增控制器,可以修改sbt配置,让应用启动时自动在同进程内启动H2浏览器:
- 确保
project/plugins.sbt中有sbt-h2插件(没有的话就添加):
addSbtPlugin("com.typesafe.sbt" % "sbt-h2" % "1.0.0")
- 在
build.sbt中添加钩子配置:
playRunHooks += baseDirectory.map(H2BrowserHook.apply).value
之后执行sbt run,H2浏览器就会和应用在同一个进程里自动启动。
二、解决H2认证错误(Wrong user name or password [28000-199])
你遇到的这个报错,大概率是配置里的小细节问题:
- 配置文件的URL带了多余引号:
你的配置写的是db.default.url="jdbc:h2:mem:play",但Play的application.conf中字符串配置不需要加双引号——加引号后实际JDBC URL会变成带引号的"jdbc:h2:mem:play",和你在H2浏览器里输入的jdbc:h2:mem:play不匹配,导致找不到数据库,进而触发认证错误。
修正后的配置应该是:db.default.driver=org.h2.Driver db.default.url=jdbc:h2:mem:play db.default.user=sa db.default.password= - 数据库未完成初始化:
play-slick是懒加载机制,如果你还没触发任何数据库操作(比如访问某个查询数据的接口),内存数据库可能还没被创建,这时候连接也会报错。解决方法是:启动应用后,先访问一个会和数据库交互的端点,确保数据库初始化完成,再去连接H2浏览器。
额外注意事项
- 内存数据库的数据会随着Play应用停止而丢失,查看数据时要确保应用处于运行状态。
- 你的环境配置(Scala 2.13、play-slick 4.0.2、H2 1.4.199)是兼容的,不需要调整版本。
内容的提问来源于stack exchange,提问作者Jethro
相关产品推荐
相关产品推荐

