簡體   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