簡體   English   中英

PlayFramework(2.5.x)不綁定返回Ojbect的表單中的數據與空字段

[英]PlayFramework (2.5.x) doesn't bind data from form returning Ojbect with null fields

問題是將數據從表單(或從參數Map)綁定到實際的Form對象。 我添加了一些println僅用於測試目的。 這是Controller類的代碼。

package controllers;

import java.util.List;

import javax.inject.Inject;

import models.Product;
import play.data.Form;
import play.data.FormFactory;
import play.mvc.Controller;
import play.mvc.Result;

import views.html.products.list;
import views.html.products.details;

public class Products extends Controller {

@Inject
public Products(FormFactory formFactory) {
    productForm =  formFactory.form(Product.class);
  }

private static Form<Product> productForm;

public  Result list(){
    List<Product> products = Product.findAll();
    return ok(list.render(products));
}
public  Result newProduct(){
    return ok(details.render(productForm));
}
public  Result save(){
    Form<Product> filledForm=productForm.fill(new Product("0000","0000","0000"));
    Form<Product> boundForm=productForm.bindFromRequest();
    final Product product =(Product) boundForm.get();
    System.out.println(">>Bound ean form data: "+boundForm.field("ean").value()+"->Product from bound form: "+boundForm.get());
    System.out.println(">>Filled ean form data: "+filledForm.field("ean").value()+"->Product from filled form: "+filledForm.get());
    //product.save();
    flash("success",String.format("Successfully added product %s", product));
    return redirect(routes.Products.list());
}

}

這里為了簡化class Product的目的, class Product只是三個公共領域:

package models;


public class Product {


    public String ean;
    public String name;
    public String description;

    public Product() {}

    public Product(String ean, String name, String description) {
        this.ean = ean;
        this.name = name;
        this.description = description;
    }

    public String toString() {
        return String.format("%s - %s", ean, name);
    }


}

這里是播放模板(沒有main包裝模板,負責<head> <body>東西)

@(productForm: Form[Product])
@import helper._

@main("Product form") {
<div class="main">
<h1>Product form</h1>
@helper.form(action = routes.Products.save(),'_class -> "form-group") {
<fieldset>
    <legend>Product (@productForm("name").valueOr("New"))</legend>
    @helper.inputText(productForm("ean"), '_label -> "EAN",'_class->"input")
    @helper.inputText(productForm("name"),'_label -> "Name",'_class->"input")
    @helper.textarea(productForm("description"), '_label -> "Description",'_class->"input")
</fieldset>
<input type="submit" class="btn btn-success" value="Save">
<a class="btn btn-warning" href="@routes.Products.index()">Cancel</a>
}

}

除了我得到具有空字段的Product對象外,所有東西都很順利,但是field(fieldName).value()data()返回正確的數據。 看起來Form表現為DynamicForm。 當我使用bind(Map<String,String>)而不是bindFromRequest()時,奇怪的事情開始發生 - 兩者都是相同的結果。 從控制台得到的結果是(我用testEAN填寫了表格“ean”字段)

    >>Bound ean form data: testEAN->Product from bound form: null - null
    >>Filled ean form data: null->Product from filled form: 0000 - 0000

需要在Product class添加屬性訪問器/ mutator( getXXX/setXXX )。 這是至關重要的一點

您必須提供表單的類型

Form<Product> boundForm = factoryForm.form(Product.class).bindFromRequest();
Product product = boundForm.get();

如果您沒有提供對象的類型,那么游戲將如何推斷字段和屬性?!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM