播放:自定义Ebean约束

Mat*_*ijn 5 java scala constraints ebean playframework-2.0

我刚开始使用Play,并试图在我的模型上获得一些自定义约束.

我发现这有效

@Constraints.Required
@Constraints.MaxLength(15)
@Constraints.MinLength(4)
@Constraints.Pattern(value = "^\\w\\s$")
public String username;
Run Code Online (Sandbox Code Playgroud)

但是现在我想用自己的实现添加一个自定义约束(用于检查唯一性)所以我尝试了这个(它由我的IDE自动完成,所以它确实存在)

@Constraints.ValidateWith(Account.UniqueValidator.class)
public String username;
Run Code Online (Sandbox Code Playgroud)

我找到了某个地方(已经经历了很多链接所以找不到它,该类应该扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道在getErrorMessageKey值中返回什么,它是一个必需的实现方法.我查看了游戏来源,发现了"东西"看起来像这样.即NotEmpty验证器.

然而,当你看到它时,你会看到它返回一个元组,而不是F.Tuple.当我在我的代码中更改它时,它抱怨它不是F.Tuple.

试图回来

return Tuple("error.invalid", new Object[] {});
Run Code Online (Sandbox Code Playgroud)

正如上面的NotEmpty验证器链接所做的那样.但是它表示在Tuple之前它需要"new",但这给了我一个包含一堆必要方法来实现的类.所以我想这不是真正的方法.


当我在这里查看play的文档时,我需要使用@CheckWith注释,但是当我选择它时,它说它找不到@CheckWith注释.

我搞不清楚了.:-)

Aar*_*ohn 4

请注意,这F.Tuple是一个需要两个模板参数的模板类型,但在return您尝试的语句中,您没有指定任何模板参数。

为了使您的代码正常工作,只需更改该行

return Tuple("error.invalid", new Object[] {});
Run Code Online (Sandbox Code Playgroud)

return new Tuple<String, Object[]>("error.invalid", new Object[] {});
Run Code Online (Sandbox Code Playgroud)

或者,你可以写

return F.Tuple("error.invalid", new Object[] {});
Run Code Online (Sandbox Code Playgroud)

在此语句中,F.Tuple是一个静态工厂方法,它构造并返回Tuple带有正确模板参数的 a 。