Play 2.6 和 Ebean 的多数据库源不工作
Play 2.6 and Ebean's multi DB sources not working
我有 2.6.5 版本的 Play 和多模块(几个 sbt 子模块)配置。我设置了 2 个不同的数据源并出现 Ebean 错误:
Caused by: javax.persistence.PersistenceException: models.common.defaultStorage.PromoBlock is NOT an Entity Bean registered with this server?
at io.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:1019)
at io.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:975)
at io.ebean.Finder.query(Finder.java:157)
at models.common.defaultStorage.PromoBlock.findByProjectId(PromoBlock.java:84)
仅当我在 application.conf
.
中设置 2 个数据源并适当映射 class 设置 时才会发生这种情况
我的build.sbt
:
lazy val common = (project in file("modules/common")).enablePlugins(PlayJava, PlayEbean)
lazy val admin = (project in file("modules/admin")).enablePlugins(PlayJava, PlayEbean).dependsOn(common)
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean).aggregate(common, admin).dependsOn(common, admin)
我的 ebean 实体位于 common
模块中。我在 root
项目中只有一个 application.conf
和 2 个数据源:
db {
default.driver = org.postgresql.Driver
default.url = "postgres://..."
mssql.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
mssql.url = "jdbc:sqlserver://..."
}
ebean.default = ["models.common.defaultStorage.*"]
ebean.mssql = ["models.common.mssqlStorage.*"]
我发现,如果我注释掉第二个 ebean.mssql
选项,那么一切正常。但是有两个不同的映射列表 class 我得到了异常。
我尝试使用文档中的所有说明 https://www.playframework.com/documentation/2.6.5/JavaEbean 但仍然没有成功。
我的plugins.sbt
:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.5")
...
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.0.3")
P.s。我正在从 Play 的 2.4(和之前的 2.3)版本迁移项目,那里一切正常。
这是最新版本的 play-ebean 模块中的一个错误,它将所有配置的数据源设置为默认值。拉取请求已于 9 月 6 日打开,但仍未合并。
确实,我已经在 play-ebean projet 上打开了一个 PR。
在我们的项目中,我们设置了一个解决方法。但是我们使用的是 Java 版本的 Play2 和 Guice。我不知道如何在 Scala 中应用这个解决方案。
在模块 class 中,我们将 DefaultEbeanConfig.EbeanConfigParser 绑定到我们自己的 class.
bind(DefaultEbeanConfig.EbeanConfigParser.class).to(CustomEbeanConfigParser.class);
此 class 的代码:
@Singleton
public class CustomEbeanConfigParser extends DefaultEbeanConfig.EbeanConfigParser implements Provider<EbeanConfig> {
private final Config _config;
@Inject
public CustomEbeanConfigParser(Config config, Environment environment, DBApi dbApi) {
super(config, environment, dbApi);
this._config = config;
}
@Override
public EbeanConfig parse() {
DefaultEbeanConfig ebeanConfig = (DefaultEbeanConfig) super.parse();
Map<String, ServerConfig> serverConfigMap = ebeanConfig.serverConfigs();
for (Map.Entry<String, ServerConfig> entry : serverConfigMap.entrySet()) {
entry.getValue().setDefaultServer(entry.getKey().equals(ebeanConfig.defaultServer()));
}
return ebeanConfig;
}
}
如您所见,我们使用提供的解析器的parse方法,解析后,我们固定"defaultServer"属性。
我有 2.6.5 版本的 Play 和多模块(几个 sbt 子模块)配置。我设置了 2 个不同的数据源并出现 Ebean 错误:
Caused by: javax.persistence.PersistenceException: models.common.defaultStorage.PromoBlock is NOT an Entity Bean registered with this server?
at io.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:1019)
at io.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:975)
at io.ebean.Finder.query(Finder.java:157)
at models.common.defaultStorage.PromoBlock.findByProjectId(PromoBlock.java:84)
仅当我在 application.conf
.
我的build.sbt
:
lazy val common = (project in file("modules/common")).enablePlugins(PlayJava, PlayEbean)
lazy val admin = (project in file("modules/admin")).enablePlugins(PlayJava, PlayEbean).dependsOn(common)
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean).aggregate(common, admin).dependsOn(common, admin)
我的 ebean 实体位于 common
模块中。我在 root
项目中只有一个 application.conf
和 2 个数据源:
db {
default.driver = org.postgresql.Driver
default.url = "postgres://..."
mssql.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
mssql.url = "jdbc:sqlserver://..."
}
ebean.default = ["models.common.defaultStorage.*"]
ebean.mssql = ["models.common.mssqlStorage.*"]
我发现,如果我注释掉第二个 ebean.mssql
选项,那么一切正常。但是有两个不同的映射列表 class 我得到了异常。
我尝试使用文档中的所有说明 https://www.playframework.com/documentation/2.6.5/JavaEbean 但仍然没有成功。
我的plugins.sbt
:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.5")
...
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.0.3")
P.s。我正在从 Play 的 2.4(和之前的 2.3)版本迁移项目,那里一切正常。
这是最新版本的 play-ebean 模块中的一个错误,它将所有配置的数据源设置为默认值。拉取请求已于 9 月 6 日打开,但仍未合并。
确实,我已经在 play-ebean projet 上打开了一个 PR。
在我们的项目中,我们设置了一个解决方法。但是我们使用的是 Java 版本的 Play2 和 Guice。我不知道如何在 Scala 中应用这个解决方案。 在模块 class 中,我们将 DefaultEbeanConfig.EbeanConfigParser 绑定到我们自己的 class.
bind(DefaultEbeanConfig.EbeanConfigParser.class).to(CustomEbeanConfigParser.class);
此 class 的代码:
@Singleton
public class CustomEbeanConfigParser extends DefaultEbeanConfig.EbeanConfigParser implements Provider<EbeanConfig> {
private final Config _config;
@Inject
public CustomEbeanConfigParser(Config config, Environment environment, DBApi dbApi) {
super(config, environment, dbApi);
this._config = config;
}
@Override
public EbeanConfig parse() {
DefaultEbeanConfig ebeanConfig = (DefaultEbeanConfig) super.parse();
Map<String, ServerConfig> serverConfigMap = ebeanConfig.serverConfigs();
for (Map.Entry<String, ServerConfig> entry : serverConfigMap.entrySet()) {
entry.getValue().setDefaultServer(entry.getKey().equals(ebeanConfig.defaultServer()));
}
return ebeanConfig;
}
}
如您所见,我们使用提供的解析器的parse方法,解析后,我们固定"defaultServer"属性。