如果编辑后的代理,我很高兴从 ListEditor 编辑代理,刷新修改回 ListEditor 约束验证。
我有以下情况: 用户有一个或多个地址。对于一个更简单的示例,Address对象具有ID和String属性(表示正确的地址。
AddressProxy 它在以下行中定义:
@ProxyFor(value = Address.class, locator = AddressLocator.class)
public interface AddressProxy extends EntityProxy {
public Long getId();
public void setId(Long id);
@NotNull(message = "The address must not be NULL.")
public String getAddress();
public void setAddress(String address);
}
所以我有一个 UserEditor(编辑器<“UserProxy>),它有一个 ListEditor<”AddressProxy,LeafValueEditor<“AddressProxy>>
ListEditor映射到CellTable,我在表后面有一个按钮,用于编辑地址列表中的某个地址。
如果我从列表中编辑一个地址,并且它有Constrain Validation错误(我删除地址字符串),则ListEditor中的地址会更新为错误值。
地址编辑器如下所示:
public class AddressEditor extends DialogBox implements LeafValueEditor<AddressProxy> {
...
public interface AddressEditorDriver extends RequestFactoryEditorDriver<AddressProxy, AddressEditor> {}
AddressEditorDriver driver = GWT.create(AddressEditorDriver .class);
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
private AddressProxy proxy;
...
public void edit(UserContext context, AddresProxy proxy) {
this.proxy = proxy;
driver.edit(proxy, context);
}
...
public void onSaveButtonClick() {
// this is where the original proxy it's updated
driver.flush();
Set<ConstraintViolation<AddressProxy>> constraints = validator.validate(proxy, Default.class);
if(constraints.size() != 0) {
Window.alert("Error encountered");
}
}
}
那么我做错了什么?如何从编辑器验证代理,而不将其刷新到原始代理?如何在修改后的代理有效后才能从驱动程序刷新代理?
答案 0 :(得分:1)
你不能。
验证需要对对象进行操作,因此您需要刷新AddressEditorDriver
;并且因为代理不能同时被两个请求上下文编辑,所以您不得不使用来自另一个驱动程序的请求上下文,这将为您提供与其他驱动程序中相同的可编辑代理,因此当您刷新{{1}时你正在修改原始代理。
有一些解决方法,但它们都涉及不可忽略的工作量和代码:
AddressEditorDriver
中编辑代理之前克隆您的代理(没有简单的方法),并在刷新后将更改应用回原始代理。AddressEditorDriver
上使用EditorVisitor
并在访问时验证每个字段,因此您无需刷新驱动程序(这会更新原始0} em> proxy)AddressEditorDriver
中的子编辑器验证字段并报告错误而非更新代理(即AddressEditor
返回原始字段来自代理的值 - 传递给getValue
的值 - 而不是编辑器中的无效值