0

考虑一个包含实体 Post 和 Author 的博客。Post 和 Author 之间存在 ManyToOne 关系:

@Entity
public class Post extends Model {
  @Required
  public String subject;

  @ManyToOne
  @Required
  public Author author;

  //...
}

然后,在视图中:

@form(routes.Post.new()) {
  @inputText(postForm("subject"))
  @select(
    postForm("author.id"), 
    options(Author.options()), 
    '_label -> "Author",
    '_default -> "-- Select author --",
    '_showConstraints -> true
  )
  <input type="submit" value="Create" />
}

在控制器中使用 a 验证此字段Form<Post>时,在执行 form.hasErrors() 时,作者字段的 @Required 约束将被忽略。

我怎么能说这个字段是必需的?

4

1 回答 1

1

id在这种情况下,您的表单默认传递Author(或空字符串,如果未选中),您最快的解决方案将是:

if (postForm.hasErrors()
        || form().bindFromRequest().get("author.id")==null
        || form().bindFromRequest().get("author.id").equals("")) {

    return badRequest(postAdd.render(postForm));
}

最终,您可以验证 Author 对象是否可访问,如果不可访问则返回错误消息:

Author authorRef =
     Author.find.ref(Long.valueOf(form().bindFromRequest().get("author.id")));

if (postForm.hasErrors() || authorRef == null) {
    return badRequest(postAdd.render(postForm));
}

编辑当然,如果您根本不传递该字段(例如,您将从@select{...}视图中删除),则@Required约束将捕获该字段。

于 2012-08-31T07:54:03.640 回答