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 迁移文档甚至没有谈论这个...
我正在从 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 迁移文档甚至没有谈论这个...