2014-03-19 21 views
0

對於此示例,用戶希望爲其網站創建博客文章。表單提交是通過AJAX處理的。 POST請求由控制器中的createPost方法處理。該方法提取json數據並將其與用戶會話數據結合以構建適當的Post對象。然後驗證數據並返回適當的響應。Play Framework 2:如何從控制器中的各種源正確構造對象,然後驗證它們?

樁模型如下:

@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,以便它可以綁定到窗體。有任何想法嗎?

回答

0

執行此操作的常用方法是在控制器端使用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() 
    .... 
} 

對於一個完整的例子,你可以簽出forms sample

而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 
    }); 
} 
+0

謝謝你的回答,但是根本沒有回答這個問題。如果處理一個包含所有模型字段的提交表單,那麼標準的.bindingFromRequest()方法將是理想的。然而,在這種情況下,問題是關於來自各種來源(不僅僅是形式)的字段並且然後驗證它們。 – Hegemon

0

這是比賽中的一個普遍問題討論形成類不應該真的域類。只適用於簡單情況。

一種替代方法是創建一個表單數據類並綁定它。表單數據類可以包含來自許多不同模型的數據。然後有代碼從你的域對象(Post)加載一個來自表單數據對象的副本域。我使用代碼生成形式數據到域對象代碼。因人而異。

相關問題