Play Framework 2.2 Ebean 依赖项?

Play Framework 2.2 Ebean dependencies?

我正在从 Play Framework 2.1.5 迁移到 2.2.6。我有很多这样的错误:

[error] C:\dev\CS\trunk\app\models\Asset.java:57: error: cannot find symbol
[error]         @NotNull
[error]          ^
[error]   symbol:   class NotNull
[error]   location: class Asset

还有这个:

play.PlayExceptions$CompilationException: Compilation error[error: package com.avaje.ebean.validation does not exist]
        at play.PlayReloader$$anon$$anonfun$reload$$anonfun$apply$$anonfun$apply.apply(PlayReloader.scala:304) ~[na:na]
        at play.PlayReloader$$anon$$anonfun$reload$$anonfun$apply$$anonfun$apply.apply(PlayReloader.scala:304) ~[na:na]
        at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
        at play.PlayReloader$$anon$$anonfun$reload$$anonfun$apply.apply(PlayReloader.scala:304) ~[na:na]
        at play.PlayReloader$$anon$$anonfun$reload$$anonfun$apply.apply(PlayReloader.scala:298) ~[na:na]

我在网上发现 in this thread 我需要在依赖项中添加一行才能使其正常工作。

"org.avaje.ebeanorm" % "avaje-ebeanorm-api" % "3.1.1",

我对此有多个问题:

1. 为什么 Ebean 需要另一个导入?我导入了javaEbean,不应该up和运行吗? 2.1.5 没问题,迁移文档中没有任何内容。

2. 看这个包的时候好像没人用。我应该使用其他东西吗?这是某种已弃用的软件包吗?

3. 我问所有这些问题的主要原因是,即使它可以解决我的开发机器 (windows) 上的这些依赖关系,当在服务器 (unix) 上部署时,它不会下载相同的 "sub-dependencies" 并且在运行时不起作用。所有的日志都指向这个导致问题的库...

谢谢!

我找到了答案,但路途遥远,让我们开始吧:

首先,Ebean是一个完全不同于Play Framework的项目,在Play Framework 2.1和Play Framework 2.2之间,Ebean的版本从3.1.2变成了3.2.2。我找不到任何发行说明或文档,但我在 a google group discussion 中找到了作者的 post,其中明确指出他从 Ebean 库中删除了验证,因为人们应该改用 JSR 303 bean 验证。由于 Ebean 是一个人的表演,这个决定似乎是最终的。

问题在于,在执行 update()save() 时,不会调用提供上述 bean 验证的库(例如 javax),这是我们代码中的回归。

经过大量阅读和测试,我们终于创建了一个基于模型的 BaseModel,它通过手动调用验证器来覆盖 save()update() 方法,如下所示:

@MappedSuperclass
public class BaseModel extends Model {

    @Override
    public void save() {
        Set<ConstraintViolation<BaseModel>> constraints = validate();

        if (constraints.size() > 0 ) {
            onFoundConstraints(constraints);
        } else {
            super.save();
        }
    }

    @Override
    public void update() {
        Set<ConstraintViolation<BaseModel>> constraints = validate();

        if (constraints.size() > 0 ) {
            onFoundConstraints(constraints);
        } else {
            super.update();
        }
    }

    private Set<ConstraintViolation<BaseModel>> validate() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        return validator.validate(this);
    }

    private void onFoundConstraints(Set<ConstraintViolation<BaseModel>> constraints) {
        String allErrors = "";
        for (ConstraintViolation<BaseModel> constraint : constraints) {
            allErrors += constraint.getRootBeanClass().getSimpleName()+
                    "." + constraint.getPropertyPath() + " " + constraint.getMessage();
        }

        throw new RuntimeException(allErrors);
    }
}

我们所有的对象现在都扩展了这个 class 并且到目前为止它运行良好。我不知道之前的验证是否做了更多的事情,但对于我们的需求来说,没问题。

我希望它能帮助其他人,因为 Play Framework 迁移文档甚至没有谈论这个...