Spring - привязка к объекту, а не к String или примитиву - PullRequest
6 голосов
/ 05 февраля 2009

Допустим, у меня есть следующий объект команды:

class BreakfastSelectCommand{
    List<Breakfast> possibleBreakfasts;
    Breakfast selectedBreakfast;
}

Как я могу сделать так, чтобы весна наполняла "selectedBreakfast" завтраком из списка?

Я думал, что сделаю что-то подобное в моем JSP:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast"  />

Но, похоже, это не работает. Есть идеи?

спасибо,

-Morgan

1 Ответ

8 голосов
/ 08 февраля 2009

Ключом ко всему этому является 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, даже если он не изменился, не должен привести к в любых неоправданных накладных расходах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...