如何从GWT RequestFactory中的ListEditor正确验证EntityProxy?

时间:2014-01-28 10:53:06

标签: gwt editor bean-validation requestfactory

如果编辑后的代理,我很高兴从 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");
        }
    }
}

那么我做错了什么?如何从编辑器验证代理,而不将其刷新到原始代理?如何在修改后的代理有效后才能从驱动程序刷新代理?

1 个答案:

答案 0 :(得分:1)

你不能。

验证需要对对象进行操作,因此您需要刷新AddressEditorDriver;并且因为代理不能同时被两个请求上下文编辑,所以您不得不使用来自另一个驱动程序的请求上下文,这将为您提供与其他驱动程序中相同的可编辑代理,因此当您刷新{{1}时你正在修改原始代理

有一些解决方法,但它们都涉及不可忽略的工作量和代码:

  • 您可以在AddressEditorDriver中编辑代理之前克隆您的代理(没有简单的方法),并在刷新后将更改应用回原始代理。
  • 也许您可以在AddressEditorDriver上使用EditorVisitor并在访问时验证每个字段,因此您无需刷新驱动程序(这会更新原始 proxy)
  • 同样,您只能使用AddressEditorDriver中的子编辑器验证字段并报告错误而非更新代理(即AddressEditor返回原始字段来自代理的值 - 传递给getValue的值 - 而不是编辑器中的无效值