UPDATE2: обновлен пример для демонстрации исходной проблемы.Если Person.address изначально имеет значение null, привязка завершается неудачей.
Я пытаюсь получить очень простой пример структуры редактора GWT, работающий с субредакторами.Я следовал псевдо-примеру здесь http://code.google.com/webtoolkit/doc/latest/DevGuideUiEditors.html
Когда я вызываю driver.flush (), значение Person.address всегда равно нулю, если исходный Person.address равен нулю - независимо от того, набрал ли язначение в поле города адреса.
Вот мои очень простые классы POJO.
public class Person {
private Address address;
private String name;
... getters and setters
}
public class Address {
private String city;
... getters and setters
}
Теперь редакторы.
public class PersonEditor extends DialogBox implements Editor<Person> {
TextBox nameEditor = new TextBox();
AddressEditor addressEditor = new AddressEditor();
Button saveButton = new Button("Save");
public PersonEditor() {
VerticalPanel vp = new VerticalPanel();
vp.add(nameEditor);
vp.add(addressEditor);
vp.add(saveButton);
add(vp);
}
public HandlerRegistration addSaveClickHandler(ClickHandler handler) {
return saveButton.addClickHandler(handler);
}
}
Редактор адресов не может быть проще,Это просто TextBox
public class AddressEditor extends Composite implements Editor<Address> {
TextBox cityEditor = new TextBox();
public AddressEditor() {
initWidget(cityEditor);
}
}
и тестовая программа.Если вы раскомментируете p.setAddress, он будет работать нормально.
// Empty interface declaration, similar to UiBinder
interface Driver extends SimpleBeanEditorDriver<Person, PersonEditor> {
}
// Create the Driver
Driver driver = GWT.create(Driver.class);
@Override
public void onModuleLoad() {
Person p = new Person();
p.setName("Bob");
Address a = new Address();
a.setCity("Los Angeles");
//p.setAddress(a);
PersonEditor editor = new PersonEditor();
editor.addSaveClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Person edited = driver.flush();
if (driver.hasErrors()) {
GWT.log("Has errors");
return;
}
GWT.log("Edited Name: " + edited.getName());
GWT.log("Edited City: " + edited.getAddress().getCity());
}
});
driver.initialize(editor);
driver.edit(p);
editor.center(); // show the dialog
}
Когда я нажимаю «Сохранить», NPE будет выброшено независимо от того, введу я город или нет.Если исходный объект person имеет некоторый ненулевой адрес, привязка будет нормально работать в обоих направлениях.