繁体   English   中英

Play Framework 2:如何从控制器中的各种来源正确构造对象,然后对其进行验证?

[英]Play Framework 2: How to correctly construct objects from various sources in the controller and then validate them?

对于此示例,用户希望为其站点创建博客文章。 表单提交是通过AJAX处理的。 POST请求由控制器中的createPost方法处理。 该方法提取json数据,并将其与用户会话数据组合以构造适当的Post对象。 然后,它验证数据并返回适当的响应。

Post模型如下:

@Entity
public Post extends model {
  @Id
  public Long id;
  @Required
  public User author;
  @Required
  public String title;
  @Required
  public String body;
}

控制器方法如下:

@BodyParser.Of(BodyParser.Json.class)
public static Result createPost() {
  JsonNode json = request().body().asJson();
  Post post = new Post();

  post.author = User.findbyId(request().username());
  post.title = json.findPath("title").textValue();
  post.body = json.findPath("body").textValue();

  Form<Post> filledForm = Form.form(Post.class).bind(Json.toJson(post));

  if (filledForm.hasErrors())
    return badRequest(filledForm.errorsAsJson());

  // save post

  return ok();  
}

现在,此方法有效,但必须有一种更好的方法,而不是接收json请求,将其提取到对象中,然后将该对象转换回json,以便可以将其绑定到表单。 有任何想法吗?

常用的方法是在控制器端使用bindFromRequest

public static Result savePost() {
    Form<Post> postForm= form(Post .class).bindFromRequest();
    if(postForm.hasErrors()) {
        Logger.error("Form has errors: " + postForm.errorsAsJson());
        return badRequest(filledForm.render(postForm));
   }
   Post post=postForm.get();
   post.save()
   ....
}

有关完整的示例,您可以签出表单样本

而AJAX帖子可能是这样的:

function postUrl(form){
    var postData = new FormData($(form)[0])
    var formURL = $(form).attr("action");
    var request=$.ajax({
        url : formURL, type: "POST", data : $(form).serialize(),
    });
    request.done(function(data) {
    //Whatever  
    });
}

在Play中一个经常讨论的问题是,表单类不应真正是域类。 仅在简单情况下有效。

一种选择是创建一个表单数据类并将其绑定。 表单数据类可以包含来自许多不同模型的数据。 然后,编写代码以从表单数据对象加载域对象(发布)和复制字段。 我将代码生成用于表单数据到域对象代码。 YMMV。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM