【问题标题】:Play : bean class is not enhanced, using EbeanServerFactory播放:没有增强bean类,使用EbeanServerFactory
【发布时间】:2015-10-26 15:02:51
【问题描述】:

使用 play framework 2.4.2,我必须连接到可以离线的远程数据库。

我试图避免启动时出现“无法连接到数据库 [distantdatabase]”异常。

在尝试了很多方法后,我决定手动创建一个 EbeanServerFactory 来访问这个远程数据库。

这是我的模型:

@Entity
@Table(name="vehicules")
public class Vehicule {
    @Id
    public Long id;
    public Long noParc;
    public Long etat;
}

这就是我尝试访问数据的方式

// Classes of distant database
List<Class<?>> saetrClasses = new ArrayList<Class<?>>();
saetrClasses.add(Vehicule.class);

// Access configuration to distant database
DataSourceConfig ds = new DataSourceConfig();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/distantdatabase");
ds.setUsername("stack");
ds.setPassword("overflow");

ServerConfig saetrServerConfig = new ServerConfig();
saetrServerConfig.setName("distantdatabase");
saetrServerConfig.setDefaultServer(false);
saetrServerConfig.setClasses(saetrClasses);
saetrServerConfig.setRegister(false);
saetrServerConfig.setDataSourceConfig(ds);

Logger.warn("EbeanServerFactory.create...");

EbeanServer saetrServer = EbeanServerFactory.create(saetrServerConfig);

saetrServer.find(Vehicule.class).where().gt("lastMaj", lastRequestTime).findList();

build.sbt

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, PlayEnhancer)

plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")

我收到以下错误

[warn] - application - EbeanServerFactory.create...
[error] - com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager - Error in deployment
java.lang.IllegalStateException: Bean class models.distantdatabase.Vehicule is not enhanced?
[...]

我不明白这个错误。我查看了很多示例,但没有找到我所缺少的。有什么想法吗?

编辑:我查看了 ebean 的源代码,我得到了这个错误,因为我的模型没有实现 EntityBean 接口。 如何强制实现此接口?

【问题讨论】:

    标签: java playframework playframework-2.0 ebean


    【解决方案1】:

    您需要声明要增强哪些类。在您的 application.conf 中,添加以下内容:

    ebean.distantdatabase = ["models.distantdatabase.*"]
    

    我认为你需要确保 EbeanServer 被急切地创建(只是一个猜测,我之前没有尝试过你的方法)。

    【讨论】:

    • 我试过了,这在远程数据库在线时有效。但是当它离线时,我在启动时遇到异常(配置错误[无法连接到数据库[distantdatabase]])。
    【解决方案2】:

    我终于明白了,数据库模型并不是 ebean 所期望的。

    为了解决这个问题,我添加了 application.conf 参数作为本地数据库:

    ebean.distantdatabase="models.distantdatabase.*"
    play.evolutions.db.distantdatabase.enabled=true
    play.evolutions.db.distantdatabase.autoApply = true
    db = {
      saetr {
        driver=com.mysql.jdbc.Driver
        url="jdbc:mysql://localhost/distantdatabase"
        username=play
        password=framework
      }
    }
    

    我在 mySQl 服务器上创建了一个空数据库“distantdatabase”。 我启动了我的应用程序一次。它在数据库中创建表,以及创建表的 sql 脚本 (/conf/evolutions/distantdatabase/1.sql)。 有了这个文件,您就可以确切地知道 ebean 期望的数据库模型。

    然后,要使用可能离线的远程数据库,您无需在 application.conf 中声明任何有关它的内容,并将 ServerConfig 声明为:

    ServerConfig saetrServerConfig = new ServerConfig();
    saetrServerConfig.setName("distantdatabase");
    saetrServerConfig.setDdlGenerate(false); // ddlGenerate drops all tables and create new tables
    saetrServerConfig.setDdlRun(false); // ddlRun run migration scripts
    saetrServerConfig.setDefaultServer(false);
    saetrServerConfig.setRegister(true);
    saetrServerConfig.setDataSourceConfig(ds);
    saetrServerConfig.setClasses(saetrClasses);
    

    您可以从 ebean 测试中找到示例:https://github.com/ebean-orm/avaje-ebeanorm/blob/master/src/test/java/com/avaje/tests/basic/MainDbBoolean.java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多