我正在从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)上部署时,它也是如此不下载相同的“子依赖项”,它在运行时不起作用。所有日志都指向此库导致问题...
谢谢!
答案 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迁移文档甚至没有谈论这个......