2014-12-16 2 views
0

в моем методе Я скажу, что объект UserDetails, который имеет определенное значение, например id, телефон и т. Д. Пользователь меняет только одно значение через форму, это электронная почта. Является способом, каким образом я мог бы использовать методКак связать данные с запросом в существующий объект? Несколько этапов формы

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

не «потерять» предыдущие значения? В приведенном выше примере дайте мне новый объект userDetail с определенным полем электронной почты. Конечно, я знаю, что я могу использовать класс DynamicForm, или просто

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

, но было бы полезно иметь метод, который делает все это связывание в одной строке.

========= EDIT

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

это не то, что я ищу.

========= РЕДАКТИРОВАНИЕ =================================== ===

Другими словами, я хочу разделить мою форму на 3 шага, но после каждого шага я делаю обновление в БД. Так, например, когда я отправляю step2 У меня есть объект со значениями из предыдущего шага:

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] 

Я буду очень полезен для любых советов.

ответ

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/Qn VjzP4ovqcJ

Form.bindFromRequest

без аргументов.Однако, как известно, большинство из вас знают, ссылаясь на , что метод без параметров свяжет все поля объекта модели с похожими именами параметров запроса, включая поля , которые не должны быть установлены снаружи (например, boolean isAuthenticated). То есть, злоумышленник может установить любое поле и обойти защиту, если они знают только имя поля модели модели . Это, конечно, катастрофическая уязвимость в области безопасности (аналогичная уязвимостям и устаревшим регистрам_globals: http://www.php.net/manual/en/security.globals.php).

0

Попробуйте

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

data() будет держать имя и значение пары, как следующие Map<String, String>, дополнительно получить значение, обеспечивая его имя ключа внутри get() вернет вам нужное значение.

+0

Ваше решение такое же, как при использовании DynamicForm. 'DynamicForm dynamicForm = Form.form(). BindFromRequest(); String email = dynamicForm.get («email»); ' – Adam

+0

@Adam Если я правильно понимаю ваш вопрос, вы хотите манипулировать свойством электронной почты в своем контроллере после его получения из предоставленного клиентом объекта UserDetail. Исправьте меня, если я ошибаюсь. – Sivakumar

+0

Вызовы, такие как bind(), bindFromRequest() или fill(), возвращают новый объект, заполненный новыми данными. Но мне просто нужно добавить дату от запроса к моему объекту. Это только вопрос строки кодов, потому что я могу сделать это с помощью dynamicForm, когда у меня будет 50 полей, это может раздражать. – Adam