我不想在application.conf
文件中定义默认数据库配置.相反,我想以编程方式构造默认的EbeanServer并将其自己注入DAO.
我遇到的问题是,如果我为EbeanServer提供程序创建一个guice绑定而没有在application.conf
文件中定义任何配置,则播放错误,说它无法找到默认配置.
这是我的代码:
public class EbeanServerProvider implements Provider{ final Logger.ALogger log = Logger.of(this.getClass()); @Override public EbeanServer get() { ServerConfig serverConfig = new ServerConfig(); DataSourceConfig dataSourceConfig = new DataSourceConfig(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Config dbConfig = ConfigFactory.load(classLoader,"env/default.conf"); /* Read the config files */ final String DB_DRIVER = dbConfig.getString("db.default.driver"); final String DB_URL = dbConfig.getString("db.default.url"); final String DB_USERNAME = dbConfig.getString("db.default.username"); final String DB_PASSWORD = dbConfig.getString("db.default.password"); log.debug("{}",DB_DRIVER); log.debug("{}",DB_URL); log.debug("{}",DB_USERNAME); log.debug("{}",DB_PASSWORD); /* Load the database driver */ dataSourceConfig.setDriver(DB_DRIVER); try{ Class.forName(DB_DRIVER).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { log.error("Unable to load database driver:{}",DB_DRIVER); throw new WrappedServerError(InternalErrorCode.TA_ERROR,"Failed to load database driver",e); } /* Set the data source configs */ dataSourceConfig.setUrl(DB_URL); dataSourceConfig.setUsername(DB_USERNAME); dataSourceConfig.setPassword(DB_PASSWORD); dataSourceConfig.setCaptureStackTrace(true); serverConfig.setDataSourceConfig(dataSourceConfig); serverConfig.setName("mysql"); serverConfig.setDefaultServer(true); serverConfig.setDdlGenerate(false); serverConfig.setDdlRun(false); serverConfig.setRegister(true); EbeanServer dbServer=null; try { dbServer = EbeanServerFactory.create(serverConfig); } catch (Exception e){ throw new WrappedServerError(InternalErrorCode.TA_INIT_ERROR,"Failed to create ebean server",e); } return dbServer; } }
application.conf
:
# Ebean configuration ebean.default = ["com.giraffe.models.*"]
guice模块绑定
//Ebean server bind(EbeanServer.class).toProvider(EbeanServerProvider.class).asEagerSingleton();
错误:
play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors: 1) Error in custom provider, Configuration error: Configuration error[null] while locating play.db.ebean.DefaultEbeanConfig$EbeanConfigParser at play.db.ebean.EbeanModule.bindings(EbeanModule.java:24): Binding(interface play.db.ebean.EbeanConfig to ProviderConstructionTarget(class play.db.ebean.DefaultEbeanConfig$EbeanConfigParser) eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1) while locating play.db.ebean.EbeanConfig for parameter 0 at play.db.ebean.EbeanDynamicEvolutions.(EbeanDynamicEvolutions.java:36) at play.db.ebean.EbeanDynamicEvolutions.class(EbeanDynamicEvolutions.java:33) while locating play.db.ebean.EbeanDynamicEvolutions at play.db.ebean.EbeanModule.bindings(EbeanModule.java:23): Binding(class play.api.db.evolutions.DynamicEvolutions to ConstructionTarget(class play.db.ebean.EbeanDynamicEvolutions) eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1) while locating play.api.db.evolutions.DynamicEvolutions Caused by: Configuration error: Configuration error[null] at play.api.Configuration$.configError(Configuration.scala:178) at play.api.Configuration.reportError(Configuration.scala:829) at play.Configuration.reportError(Configuration.java:351) at play.db.ebean.DefaultEbeanConfig$EbeanConfigParser.parse(DefaultEbeanConfig.java:81) at play.db.ebean.DefaultEbeanConfig$EbeanConfigParser.get(DefaultEbeanConfig.java:60) at play.db.ebean.DefaultEbeanConfig$EbeanConfigParser.get(DefaultEbeanConfig.java:44) at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72) at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61) at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62) at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
jesukumar.. 6
遵循@BatteryAcid的提示后,我能够解决问题:
将ebean增强与ebean默认服务器实例化分开.为此,我'ebean.default = ['models.*]'
从application.conf
文件中删除了设置.我添加了以下内容build.sbt
.
build.sbt
playEbeanModels in Compile := Seq("models.*") playEbeanDebugLevel := 4
这可确保您的模型得到增强.
对于服务器实例化,我保留了我的EbeanServerProvider类
EbeanServerProvider.java
public class EbeanServerProvider implements Provider{ final Logger.ALogger log = Logger.of(this.getClass()); @Override public EbeanServer get() { ServerConfig serverConfig = new ServerConfig(); DataSourceConfig dataSourceConfig = new DataSourceConfig(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Config dbConfig = ConfigFactory.load(classLoader,"env/default.conf"); /* Read the config files */ final String DB_DRIVER = dbConfig.getString("db.default.driver"); final String DB_URL = dbConfig.getString("db.default.url"); final String DB_USERNAME = dbConfig.getString("db.default.username"); final String DB_PASSWORD = dbConfig.getString("db.default.password"); log.debug("{}",DB_DRIVER); log.debug("{}",DB_URL); log.debug("{}",DB_USERNAME); log.debug("{}",DB_PASSWORD); /* Load the database driver */ dataSourceConfig.setDriver(DB_DRIVER); try{ Class.forName(DB_DRIVER).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { log.error("Unable to load database driver:{}",DB_DRIVER); throw new WrappedServerError(InternalErrorCode.TA_ERROR,"Failed to load database driver",e); } /* Set the data source configs */ dataSourceConfig.setUrl(DB_URL); dataSourceConfig.setUsername(DB_USERNAME); dataSourceConfig.setPassword(DB_PASSWORD); dataSourceConfig.setCaptureStackTrace(true); serverConfig.setDataSourceConfig(dataSourceConfig); serverConfig.setName("mysql"); serverConfig.setDefaultServer(true); serverConfig.setDdlGenerate(false); serverConfig.setDdlRun(false); serverConfig.setRegister(true); /* Add the models to the package */ serverConfig.addClass( ); EbeanServer dbServer=null; try { dbServer = EbeanServerFactory.create(serverConfig); } catch (Exception e){ throw new WrappedServerError(InternalErrorCode.TA_INIT_ERROR,"Failed to create ebean server",e); } return dbServer; } }
这里要注意的是serverConfig.addClass
方法.您必须以这种方式注册所有模型类.这意味着如果你有10个型号,你将有10个这样的电话serverConfig.addClass
.这是愚蠢的.
有一种serverConfig.addPackage
方法,据说可以读取给定包中的所有模型并将其注册到EbeanServer.但它没有用.由于我目前只有几个型号,因此该解决方案现在可以使用.
Guice绑定
//Ebean server bind(EbeanServer.class).toProvider(EbeanServerProvider.class).asEagerSingleton();
如果您有任何阅读此内容的人有更好的解决方案,请在此处发布.
遵循@BatteryAcid的提示后,我能够解决问题:
将ebean增强与ebean默认服务器实例化分开.为此,我'ebean.default = ['models.*]'
从application.conf
文件中删除了设置.我添加了以下内容build.sbt
.
build.sbt
playEbeanModels in Compile := Seq("models.*") playEbeanDebugLevel := 4
这可确保您的模型得到增强.
对于服务器实例化,我保留了我的EbeanServerProvider类
EbeanServerProvider.java
public class EbeanServerProvider implements Provider{ final Logger.ALogger log = Logger.of(this.getClass()); @Override public EbeanServer get() { ServerConfig serverConfig = new ServerConfig(); DataSourceConfig dataSourceConfig = new DataSourceConfig(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Config dbConfig = ConfigFactory.load(classLoader,"env/default.conf"); /* Read the config files */ final String DB_DRIVER = dbConfig.getString("db.default.driver"); final String DB_URL = dbConfig.getString("db.default.url"); final String DB_USERNAME = dbConfig.getString("db.default.username"); final String DB_PASSWORD = dbConfig.getString("db.default.password"); log.debug("{}",DB_DRIVER); log.debug("{}",DB_URL); log.debug("{}",DB_USERNAME); log.debug("{}",DB_PASSWORD); /* Load the database driver */ dataSourceConfig.setDriver(DB_DRIVER); try{ Class.forName(DB_DRIVER).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { log.error("Unable to load database driver:{}",DB_DRIVER); throw new WrappedServerError(InternalErrorCode.TA_ERROR,"Failed to load database driver",e); } /* Set the data source configs */ dataSourceConfig.setUrl(DB_URL); dataSourceConfig.setUsername(DB_USERNAME); dataSourceConfig.setPassword(DB_PASSWORD); dataSourceConfig.setCaptureStackTrace(true); serverConfig.setDataSourceConfig(dataSourceConfig); serverConfig.setName("mysql"); serverConfig.setDefaultServer(true); serverConfig.setDdlGenerate(false); serverConfig.setDdlRun(false); serverConfig.setRegister(true); /* Add the models to the package */ serverConfig.addClass( ); EbeanServer dbServer=null; try { dbServer = EbeanServerFactory.create(serverConfig); } catch (Exception e){ throw new WrappedServerError(InternalErrorCode.TA_INIT_ERROR,"Failed to create ebean server",e); } return dbServer; } }
这里要注意的是serverConfig.addClass
方法.您必须以这种方式注册所有模型类.这意味着如果你有10个型号,你将有10个这样的电话serverConfig.addClass
.这是愚蠢的.
有一种serverConfig.addPackage
方法,据说可以读取给定包中的所有模型并将其注册到EbeanServer.但它没有用.由于我目前只有几个型号,因此该解决方案现在可以使用.
Guice绑定
//Ebean server bind(EbeanServer.class).toProvider(EbeanServerProvider.class).asEagerSingleton();
如果您有任何阅读此内容的人有更好的解决方案,请在此处发布.