我在gwt开发模式下运行时遇到的客户端bean验证行为与编译模式不同。我一直试图调试并解决这个问题几个小时(实际上是几天)但是,虽然还没有找到根本原因并且目前卡住了。因此我请求帮助。
总的来说,我一直在遵循这里倡导的方法http://www.gwtproject.org/doc/latest/DevGuideValidation.html 并且更多地受到StackOverlow上的各种文章和问题的启发。所以我让用户在客户端上输入一个对象。比我通过调用验证器工厂创建的验证器验证客户端。
我遇到的问题是,当验证多个约束时(即用户输入2个或更多“错误”),验证器在编译模式下运行时(总是)不会返回所有约束违规,而它确实返回它们都是在gwt开发模式下运行的。
我尝试验证的对象属于类EnvyMonUser
@Entity
public class EnvyMonUser implements Serializable, Obj<EnvyMonUser> {
private static final long serialVersionUID = 3L;
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
@Id
private Long id;
@NotNull(message = "company must be selected")
@Index
private Key<Company> companyKey;
@Index
private String googleUserId;
@NotNull(message = "email address must be set")
@Pattern(regexp = EMAIL_PATTERN, message = "invalid email address")
@Index
private String email;
@NotNull(message = "name must be set")
@Size(min = 3, message = "must have a name of minimal 3 characters")
@Index
private String nickName;
@NotNull(message = "location must be selected")
@Index
private Key<SampleLocation> sampleLocationKey;
@NotNull(message = "result must be set")
@Index
private Long value;
...
Company
和SampleLocation
是另外两个类。 (注释@ Entity,@ Index,@ Id和类Key是Objectify。我使用相同的实体类客户端和服务器(gae)方。)
一旦用户输入了EnvyMonUser对象,我就通过验证器对其进行验证,即
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
...
EnvyMonUser obj = getView().getEditorDriver().flush();
Set<ConstraintViolation<O>> validate = validator.validate(obj);
我的验证工厂是
public final class AppValidatorFactory extends AbstractGwtValidatorFactory {
@GwtValidation(value = { MonitorType.class, Measurement.class,
ProgramMeasurement.class, EnvyMonUser.class, Company.class,
SampleLocation.class })
public interface GwtValidator extends Validator {
}
@Override
public AbstractGwtValidator createValidator() {
return GWT.create(GwtValidator.class);
}
}
我做错了吗?
绝望,因为我尝试删除并添加几个字段,但没有找到任何逻辑模式。根据我遗漏的字段以及用户正确填充哪些字段,编译模式中的(缺失)约束会发生变化。
到目前为止,我已经尝试了多条路线但没有成功。例如,在某些时候,我认为这是由使用客观化引起的。但是,当我删除sampleLocationKey
成员时,它对于companyKey成员来说非常好。我也尝试删除了客观化属性,但这似乎也没有什么区别。
我确实观察到的一件有趣的事情(偶然)是当我从hashCode
和equals
方法中删除(评论)某些成员时,行为会发生变化。不知道为什么会这样。也许它与验证器生成器的实现方式有关。
有没有人有任何线索?
也赞赏正确方向的指针。例如,有人知道我在哪里可以找到生成的验证器。还是验证器生成器的来源?
我使用的某些版本的库:
答案 0 :(得分:1)
我有同样的问题。验证在开发模式下工作正常,并且所有错误消息都显示在UI上,但在生产模式下,我们一次只能看到一条错误消息。调试后期,发现我的DTO已经实现了equals和hashcode方法以及导致此问题的原因。从我的DTO中删除了这两个实现的时刻,之后每件事情都运行良好。
我正在使用GWT 2.6.1。
答案 1 :(得分:0)
原来问题不在我的代码中,而是com.google.gwt.validation.client.impl.ConstraintViolationImpl
的gwt来源中的错误。有关问题和解决方案的完整说明,请参阅https://groups.google.com/forum/#!topic/Google-Web-Toolkit/xRVGnMWfttc。