如何将请求中的数据绑定到现有对象?形成多个步骤

时间:2014-12-16 14:24:21

标签: java playframework playframework-2.3

在我的方法中,我让我们说UserDetails对象有一些定义的值,如id,phone等。 用户只通过表格,即电子邮件更改一个值。是我如何使用方法

的方式
userDetailsForm.bindFromRequest(new String[]{"email"}).get() 

不要松散'以前的值?上面的示例为我提供了仅具有已定义的电子邮件字段的新userDetail对象。当然我知道我可以使用DynamicForm类,或者只是

userDetailsForm.bindFromRequest().get().getEmail()

但是让方法在一行中完成所有这些绑定会很有帮助。

====== EDIT

DynamicForm dynamicForm = Form.form().bindFromRequest(); 
String email = dynamicForm.get("email");

不是我正在寻找的东西。

====== EDIT ================================== ====

换句话说,我想将表单分为3个步骤,但是在每个步骤之后我都在对DB进行更新。因此,例如当我发布第2步时,我有来自上一步的值的对象:

User [userId=8, createdById=12, name=null, active=false, country=EN]

所以现在我正在做的事情:

static Form<User> userForm = Form.form(User.class);
User user = User.find(8);
User user2 = (User) userForm.fill(user).bindFromRequest("name").get();

我正在使用空字段设置新对象:

User [userId=0, createdById=0, name="value from step 2", active=false, country=null]

我会非常满意任何建议。

2 个答案:

答案 0 :(得分:0)

试试这个

Form<UserDetail> submittedForm = form(UserDetail.class).bindFromRequest();
String emailID = submittedForm.data().get("email");

data()将保留名称和值对,例如关注Map<String, String>,通过在get()中提供其键名来进一步检索值将返回所需的值。

答案 1 :(得分:0)

好的,伙计,我已经想出如何解决问题。 以下是对此的讨论: https://groups.google.com/forum/#!searchin/play-framework/Form $ 20bind /播放框架/ MtjBV5YNQ3E / QumAmLbMl5sJ 可能的解决方案之一是: https://gist.github.com/nraychaudhuri/10590943

import com.fasterxml.jackson.databind.ObjectMapper;
private static Form<Computer> editableForm(final Computer obj) {
            ObjectMapper mapper = new ObjectMapper();
            Form<Computer> form = Form.form(Computer.class);
            Map<String,String> data = mapper.convertValue(obj, Map.class);
            Map<String, String> submittedData = form.bindFromRequest().data();
            data.putAll(submittedData);
            return form.bind(data);
        }

我的解决方案如下:

public T bind(T target, Map<String, String> newValues) {
    DataBinder binder = new DataBinder(target);
    binder.setAllowedFields(getAllowedFields());
    binder.bind(new MutablePropertyValues(newValues));
    return target;
}

================= EDIT

以下是关于安全问题的重要讨论:https://groups.google.com/forum/#!searchin/play-framework/Form $ 20bind / play-framework / uGrSlJMo48c / QnVjzP4ovqcJ

  

Form.bindFromRequest

     

没有参数。但是,正如大多数人所知,调用   没有参数的方法将绑定的所有字段   相应的模型对象,以类似命名的请求参数,包括   保持内部状态的字段,永远不能从外部设置   (例如boolean isAuthenticated)。也就是说,攻击者可以设置任何字段   如果他们只知道该名称,则规避安全   相应的模型对象字段。这当然是灾难性的   安全漏洞(类似于PHP的臭名昭着和弃用   register_globals选项:   http://www.php.net/manual/en/security.globals.php)。