GWT Bean验证不会在编译模式下返回所有约束违规

时间:2014-07-06 19:14:18

标签: gwt bean-validation objectify

我在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;

...

CompanySampleLocation是另外两个类。 (注释@ 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成员来说非常好。我也尝试删除了客观化属性,但这似乎也没有什么区别。

我确实观察到的一件有趣的事情(偶然)是当我从hashCodeequals方法中删除(评论)某些成员时,行为会发生变化。不知道为什么会这样。也许它与验证器生成器的实现方式有关。

有没有人有任何线索?

也赞赏正确方向的指针。例如,有人知道我在哪里可以找到生成的验证器。还是验证器生成器的来源?

我使用的某些版本的库:

  • gwt 2.6.0
  • 冬眠验证器-4.1.0.Final.jar
  • 冬眠-验证-4.1.0.Final-sources.jar
  • SLF4J-API-1.6.1.jar
  • SLF4J-log4j12-1.6.1.jar
  • 的log4j-1.2.16.jar
  • objectify 4.0.1

2 个答案:

答案 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