Play Framework 2.2 Ebean依赖项?

时间:2015-09-08 12:34:46

标签: maven playframework-2.0 ebean

我正在从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$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
        at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
        at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
        at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:304) ~[na:na]
        at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:298) ~[na:na]

我找到了在线in this thread,我需要在我的依赖项中添加一行才能使其正常工作。

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

我有很多疑问:

1。为什么Ebean需要另一次导入?我导入了javaEbean,不应该足以启动并运行吗?没关系2.1.5并且在迁移文档中没有任何指示。

2。当我看这个包时,似乎没有人使用它。我应该使用其他东西吗?这是某种被弃用的包吗?

3。我问所有这些问题的主要原因是,即使它在我的开发机器(windows)上解决这些依赖关系,在服务器(unix)上部署时,它也是如此不下载相同的“子依赖项”,它在运行时不起作用。所有日志都指向此库导致问题...

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了答案,但这是漫长的旅程,让我们开始吧:

首先,Ebean是一个完整的其他项目而不是Play Framework,在Play Framework 2.1和Play Framework 2.2之间,Ebean的版本从3.1.2变为3.2.2。我找不到任何发行说明或文档,但我在a google group discussion中找到了作者的帖子,该帖子清楚地表明他从Ebean库中删除了验证,因为人们应该使用JSR 303 bean验证。由于Ebean是一个单人秀,决定似乎是最终的。

问题在于,在执行代码中的回归update()save()时,不会调用提供此表示bean验证的库(例如javax)。

经过多次阅读和测试后,我们终于创建了一个基于Model的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);
    }
}

我们所有的对象现在扩展了这个类,到目前为止它运行良好。我不知道之前的验证是否做了更多的事情,但是根据我们的需要,没关系。

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