【问题标题】:How to properly validate an EntityProxy from a ListEditor in GWT RequestFactory?如何从 GWT RequestFactory 中的 ListEditor 正确验证 EntityProxy?
【发布时间】:2014-01-28 10:53:06
【问题描述】:

我在从 ListEditor 编辑代理时遇到问题,如果编辑的代理刷新修改回 ListEditor约束验证

我有以下情况: 一个用户有一个或多个地址。举个更简单的例子,A​​ddress 对象有一个 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 (Editor),它有一个 ListEditor>

ListEditor 映射到 CellTable,表格后面有一个按钮,用于编辑地址列表中的某个地址。

如果我从列表中编辑地址,并且它有约束验证错误(我删除地址字符串),则 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");
        }
    }
}

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

【问题讨论】:

    标签: gwt editor bean-validation requestfactory


    【解决方案1】:

    你不能。

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

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

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

    【讨论】:

    • 感谢托马斯的回复。在开始这个项目之前,我喜欢 GWT(RequestFactory) 的一切(我已经学习了一些教程)。现在我真的不喜欢它,因为有很多情况(如上面的情况)我必须编写变通方法(需要中到大量的代码)来解决异常情况。真让我生气。 RF 有一些亮点,也有一些很烦人的部分(现在我更喜欢 RPC :D)。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多