Ключом ко всему этому является PropertyEditor.
Вам необходимо определить PropertyEditor для вашего класса «Завтрак», а затем настроить ServletDataBinder с помощью registerCustomEditor в методе initBinder вашего контроллера.
пример:
public class BreakfastPropertyEditor extends PropertyEditorSupport{
public void setAsText(String incomming){
Breakfast b = yourDao.findById( Integer.parseInt(incomming));
setValue(b);
}
public String getAsText(){
return ((Breakfast)getValue()).getId();
}
}
заметьте, вам понадобится проверка нуля и т. Д., Но вы поняли идею. В вашем контроллере:
public BreakfastFooBarController extends SimpleFormController {
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao));
}
}
что нужно остерегаться:
- PropertyEditor не является потокобезопасным
- если вам нужны пружинные бобы, введите их вручную или определите весной как область действия прототипа и используйте метод ввода в ваш контроллер
- сгенерировать исключение IllegalArgumentException, если входящий параметр недействителен / не найден, Spring правильно преобразует его в ошибку привязки
надеюсь, это поможет.
Изменить (в ответ на комментарий):
Это выглядит немного странно в данном примере, потому что BreakfastSelectCommand не похож на сущность, я не уверен, какой у вас реальный сценарий. Скажем, это сущность, например, Person
со свойством breakfast
, тогда метод formBackingObject()
загрузит объект Person из PersonDao
и вернет его в качестве команды. Фаза привязки будет затем изменять свойство завтрака в зависимости от выбранного значения, так что команда, которая поступает в onSubmit
, имеет настроенное свойство завтрака.
В зависимости от реализации ваших объектов DAO, вызывающих их дважды или пытающихся загрузить одну и ту же сущность дважды, на самом деле не означает, что вы получите два выполняемых оператора SQL. Это особенно относится к Hibernate, где он гарантирует, что он вернет тот же объект, который находится в его сеансе для данного идентификатора, таким образом, запуск, позволяющий попытке привязки загрузить выбор Breakfast
, даже если он не изменился, не должен привести к в любых неоправданных накладных расходах.