我刚刚开始使用Play,并试图在我的模型上获得一些自定义约束。
我发现这有效
@Constraints.Required
@Constraints.MaxLength(15)
@Constraints.MinLength(4)
@Constraints.Pattern(value = "^\\w\\s$")
public String username;
但是现在我想添加一个带有自己实现的自定义约束(用于检查唯一性)所以我尝试了这个(它由我的IDE自动完成,所以它确实存在)
@Constraints.ValidateWith(Account.UniqueValidator.class)
public String username;
我找到了某个地方(已经经历了很多链接,因此无法找到它,该类应该扩展Constraints.Validator
这就是我所做的。
private class UniqueValidator extends Constraints.Validator<String>
{
@Override
public boolean isValid(String s) {
return Account.find.where().eq("username", s).findRowCount() == 0;
}
@Override
public F.Tuple<String, Object[]> getErrorMessageKey() {
return null;
}
}
但是我不知道在getErrorMessageKey值中返回什么,它是一个必需的实现方法。我查看了游戏来源,发现了“东西”看起来像这样。即NotEmpty验证器。
然而,当你看到它时,你会看到它返回一个元组,而不是一个F.Tuple。当我在我的代码中更改它时,它会抱怨它不是F.Tuple。
试图返回
return Tuple("error.invalid", new Object[] {});
正如上面的NotEmpty验证器链接所做的那样。但是它表示在Tuple之前它需要“new”,但是这给了我一个具有a bunch所需方法的类来实现。所以我想这不是真正的方法。
当我查看play here的文档时,我需要使用@CheckWith注释,但是当我选择它时,它说它找不到@CheckWith注释。
我迷路了。 :-)
答案 0 :(得分:4)
请注意F.Tuple
是一个模板类型,需要两个模板参数,但在您尝试的return
语句中,您没有指定任何模板参数。
为了使您的代码有效,只需更改行
即可return Tuple("error.invalid", new Object[] {});
到
return new Tuple<String, Object[]>("error.invalid", new Object[] {});
或者,你可以写
return F.Tuple("error.invalid", new Object[] {});
在此语句中,F.Tuple
是一个静态工厂方法,它使用正确的模板参数构造并返回Tuple
。