1

我正在使用 playframework 2 和 extjs4 构建网络服务。直到今天,我已经设法克服了任何障碍。但这是我一个人无法应对的事情。我跟着教程,但它没有帮助我。嗯,起初确实如此。我知道它有效,我能够向数据库(mongodb)添加一些值。我怀疑它是否重要,但是:

  • 一切正常,我在数据库中添加了一些测试数据
  • 我用Java写了一些其他方法
  • db.Category.remove()在我的 mongo 收藏中使用过
  • 服务器现在无法从表单接收任何值

我有Ext.FormPanel2 个字段:

items: [
    { 
        id: 'categoryName',
        fieldLabel: 'Category name', 
        name: 'categoryName', 
        allowBlank: false 
    },{
        xtype: 'textarea',
        id: 'categoryDescription',
        fieldLabel: 'Description',
        name: 'categoryDescription',
        allowBlank: true
    }
]

对应Model的类如下所示:

@MongoCollection(name = "Category")
public class CategoryModel{
    private String categoryName;
    private String categoryDescription;

    @JsonProperty("categoryName")
    public String getName() {
        return categoryName;
    }

    @JsonProperty("categoryName")
    public void setName(String name) {
        this.categoryName = name;
    }

    @JsonProperty("categoryDescription")
    public String getDescription() {
        return categoryDescription;
    }

    @JsonProperty("categoryDescription")
    public void setDescription(String description) {
        this.categoryDescription = description;
    }

    public String toString(){
        ObjectMapper mapper = new ObjectMapper();
        String json = null;
        try {
            json = mapper.writeValueAsString(this);
        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return json;
    }
}

最后,这是我想要接收值的地方:

Form<CategoryModel> categoryForm = form(CategoryModel.class);
System.out.println(categoryForm);

Play 控制台的输出:

Form(of=class kunto.models.CategoryModel, data={}, value=None, errors={})

Firebug 显示 POST 值正在正确发送:

categoryDescription test
categoryName    test

POST在服务器端为这个特定请求定义了 conf/routes 中的请求类型。

我有两个问题:

  • 该怎么做才能解决它?
  • 更重要的是,为什么会这样?

编辑 正如@adis 建议的那样:

Form<CategoryModel> categoryForm = form(CategoryModel.class).bindFromRequest();
System.out.println(categoryForm);
System.out.println(categoryForm.data());

输出:

Form(of=class kunto.models.CategoryModel, data={categoryName=test, categoryDescription=test}, value=Some({"categoryName":null,"categoryDescription":null}), errors={})
{categoryName=test, categoryDescription=test}

我也查了

CategoryModel categoryModel = form(CategoryModel.class).bindFromRequest().get();
System.out.println(categoryModel);

它输出:{"categoryName":null,"categoryDescription":null}

任何人都可以解释这个吗?

4

2 回答 2

1

如评论所述,您必须通过以下方式将请求绑定到模型:

 Form<CategoryModel> categoryForm = form(CategoryModel.class).bindFromRequest();

如果您已定义它们,这将允许您检查模型中的属性,例如:@Contraints.Required。

绑定后,您将获得表单对象和get模型实例:

CategoryModel newCatModel = categoryForm.get();

这应该为您提供一个模型实例,其中填充了来自您的 post reqeust 的数据。通常这种方法看起来像:

Form<Task> taskForm = form(Task.class).bindFromRequest();

if (taskForm.hasErrors()) {  // check for constraints
    Logger.info("Error:" + taskForm);
    return badRequest(views.html.task.create.render(taskForm));
}
// here get the model instance
Task newTask = taskForm.get();

希望这可以帮助。

于 2012-05-03T19:44:57.623 回答
0

只是一个猜测,但你不应该注释属性而不是吸气剂吗?

@JsonProperty("description")
public void setDescription(String description) {
    this.categoryDescription = description;
}

应该

@JsonProperty("description")
private String description;

您在上面的代码中也存在差异.. 描述的 getter 绑定到“categoryDe​​scription”,而 setter 绑定到“description”

于 2012-05-06T10:36:15.300 回答