Gwt 如何在域类(RequestFactory)上使用带注释的规则进行客户端验证?
我一直在用GWT2.4开发一个项目,并在寻找一种方法来验证(JSR303)我的客户机(代理)类,而无需从我的域类(服务器端)重新创建注释。我知道有一个示例附带了GWT主干代码(验证),但它不使用RequestFactory,而是使用RPC 是否可以从客户端的域类进行验证?将我的域模型与客户端代码共享是最好的策略吗 据我所知,GWT团队正在2.3和2.4上开发此功能。是已经完成了,还是应该等待GWT2.5 这已经发布在GWT论坛上,但仍然没有答案 谢谢 编辑:这就是客户端验证(未测试)的方式。Gwt 如何在域类(RequestFactory)上使用带注释的规则进行客户端验证?,gwt,bean-validation,requestfactory,hibernate-validator,Gwt,Bean Validation,Requestfactory,Hibernate Validator,我一直在用GWT2.4开发一个项目,并在寻找一种方法来验证(JSR303)我的客户机(代理)类,而无需从我的域类(服务器端)重新创建注释。我知道有一个示例附带了GWT主干代码(验证),但它不使用RequestFactory,而是使用RPC 是否可以从客户端的域类进行验证?将我的域模型与客户端代码共享是最好的策略吗 据我所知,GWT团队正在2.3和2.4上开发此功能。是已经完成了,还是应该等待GWT2.5 这已经发布在GWT论坛上,但仍然没有答案 谢谢 编辑:这就是客户端验证(未测试)的方式。
@UiHandler("save")
void onSave(ClickEvent event) {
Modulo modulo = new Modulo(); //domain class
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Modulo>> violations = validator.validate(modulo, Default.class);
delegate.saveClicked();
}
@UiHandler(“保存”)
保存时无效(单击事件){
模模=新模();//域类
Validator Validator=Validation.buildDefaultValidatorFactory().getValidator();
设置冲突=validator.validate(模,默认值.class);
delegate.saveClicked();
}
我发现最好的选择是等待。GWT团队仍在进行客户端验证,预计将在夏季结束
2012年4月10日,项目成员ncha...@google.com的评论:
“我计划在今年夏天完成规范的实施。”
由于此应用程序没有太多的输入数据,我选择只在服务器上进行验证。找到了一个(临时)解决方案,在客户端和服务器上使用相同的验证注释
将JSR303注释放在一个单独的接口中,该接口由代理接口(客户端)和域类(服务器)实现。当然,这个接口必须在共享包中
由于验证注释将自动向下传递到继承层次结构,因此验证现在应该可以在客户端和服务器上进行
例子
以下是用户尝试注册时使用的对象的示例:
UserProxyValid
是包含JSR 303验证注释的公共接口:
public interface UserProxyValid {
@NotBlank(
groups = {ClientGroup.class, ServerGroup.class})
@UniqueEmail(
groups = {ServerGroup.class})
String getEmail();
@NotBlank(
groups = {ClientGroup.class, ServerGroup.class})
@Size(
min = 4, max = 25,
groups = {ClientGroup.class, ServerGroup.class})
String getPassword();
}
User
是服务器上的域类:
public class User implements UserProxyValid {
private String email;
private String password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最后是客户端的UserProxy
:
@ProxyFor(value = User.class)
public interface UserProxy extends ValueProxy, UserProxyValid {
String getEmail();
void setEmail(String email);
String getPassword();
void setPassword(String password);
}
Validator clientValidator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<UserProxy>> violations = clientValidator.validate(userProxy, ClientGroup.class);
组
通过组我们可以让舒尔确保在客户端或服务器上或两者上进行单独验证。(如上例所示,只能在服务器上验证电子邮件的唯一性。)
以下是在客户端上验证对象的方式:
@ProxyFor(value = User.class)
public interface UserProxy extends ValueProxy, UserProxyValid {
String getEmail();
void setEmail(String email);
String getPassword();
void setPassword(String password);
}
Validator clientValidator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<UserProxy>> violations = clientValidator.validate(userProxy, ClientGroup.class);
Validator clientValidator=Validation.buildDefaultValidatorFactory().getValidator();
设置冲突=clientValidator.validate(userProxy,ClientGroup.class);
下面是如何在服务器上进行验证:
Validator serverValidator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<User>> violations = serverValidator.validate(user, ServerGroup.class);
Validator-serverValidator=Validation.buildDefaultValidatorFactory().getValidator();
设置冲突=serverValidator.validate(用户,ServerGroup.class);
对未来的希望
当然,没有额外的
UserProxyValid
类会更好。因此,一旦Google提供了一个更新,我们就可以删除该类,并将注释移动到域类。我很困惑。如果我的代理与我的域对象不匹配,我已经收到编译时错误。我将GWT2.4用于Maven。你的问题是什么?我问的是JSR303上描述的运行时验证。是的,对我来说,这种验证是在编译时自动完成的。那么你的问题是什么?我不明白“从客户端的域类获取验证”是什么意思。我想他谈论的是验证域对象上的字段和属性(如@NotNull等)@Umit。是的,我认为这在问题的主体中是清楚的。谢谢。请求工厂的客户端验证现在已经实现了吗?找不到有关该主题的任何有用信息。此操作仅适用于primitiv类型。如果用户类具有例如属性Car,则不能共享相同的界面。