Допустим, у нас есть объект домена, определенный следующим образом:
interface MyNode {
MyNode getParent();
void setParent(MyNode node);
List<MyNode> GetChildren();
void AddChild(MyNode node);
void RemoveChild(MyNode node);
String getText();
void setText(String text);
}
Я пытаюсь реализовать веб-приложение GWT для работы с этими объектами. Я использую фабрику запросов и структуру редакторов. А у меня точно проблемы :-)
Поскольку определения фабрик запросов тривиальны, я не буду публиковать их здесь. Я бы только сказал, что все, что связано с детьми, это набор InstanceRequest
.
Итак, проблема №1
Допустим, мы хотим иметь навигатор для всего дерева. Идея состоит в том, что каждый раз, когда мы видим только один узел, мы можем либо перейти к его родителю, либо к одному из его дочерних элементов. Мы хотели бы, чтобы этот навигатор использовал структуру редакторов, поэтому мы создаем такие редакторы, как MyNodeEditor
и ChildrenListEditor
.
Насколько мне известно, редакторы применимы только непосредственно к сущностям в стиле bean-компонентов. Таким образом, пока работа со свойством MyNode
text
работает нормально, для работы со свойством children
(ChildrenListEditor
) требуется запрос экземпляра.
Мое решение состоит в том, чтобы сделать MyNodeEditor
ValueAwareEditor
, и когда он получит свое значение, он инициирует InstanceRequest
для получения списка дочерних узлов. Затем этот список привязывается к ChildrenListEditor
.
Есть ли более простые решения? Я считаю, что это довольно простой сценарий.
Проблема №2
Теперь мы решили сделать наш MyNodeEditor
доступным для редактирования. Свойства в стиле бобов снова в порядке, но как насчет детей? Используя код, упомянутый в задаче №1:
@Override public void setValue(MyNodeProxy value) {
...
requestFactory.myNodeRequest().getChildNodes().using(value).fire(new Receiver<List<MyNodeProxy>>() {
@Override public void onSuccess(List<MyNodeProxy> response) {
childrenDriver.display(response);
}
});
...
}
вызывает «Вызвано: java.lang.IllegalArgumentException: попытка отредактировать EntityProxy, ранее отредактированный другим RequestContext», потому что у меня есть 2 разных запроса для одного и того же объекта здесь. У меня нет доступа к RequestContext
, который я построил в MyNodeEditor
, поэтому я строю новый, и он терпит неудачу. Каков правильный подход?