无需ImplicitFieldConstructor即可访问FieldElements

时间:2012-07-03 07:19:45

标签: playframework validation

我们在为表单验证/授权定义错误消息时尝试保持一致,但我们发现使用Play 2.0的@Constraints等有点困难。

我们想要的是能够访问每个错误(以及相关的i18n-translation),最好是通过错误对象。然而,这被证明是相当困难的,因为错误(至少来自@Constraint)被应用于ImplicitFieldConstructor中的i18n翻译,我们实际上并没有太多的访问权。

我们想知道的是,是否有办法在不通过ImplicitFieldConstructor的情况下访问表单中每个字段的所有FieldElements? (绝望地试过@helper.FieldElements)

当然我们可以放弃整个@Constraints,只是定义我们自己的验证器和验证方法,但它似乎有点反直觉,因为我们想要使用框架来实现它的全部价值。

编辑:另外,我们尝试了这个:

    @for((key, value) <- loginForm.errors) {
        @value.get(0)
    }

但这只是给了我们消息(例如'error.required')而不是i18n-translation。

修改

我们现在使用它作为修复它的黑客,但我想找到一种更好的方法来处理它。

    if (loginForm.hasErrors()) {
        // TODO: find a better solution to handle this problem.
        for(Map.Entry<String, List<ValidationError>> entry : loginForm.errors().entrySet() ) {
            ValidationError oldError = entry.getValue().get(0);
            // applay i18n-translation to error message.
            ValidationError error = new ValidationError(oldError.key(),  Messages.get(oldError.message()), new ArrayList());
            entry.getValue().set(0, error);
        }
        return badRequest(index.render(loginForm));

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您有权访问要添加验证的.java文件,则可以在Constraint中添加message =“Text”元素。这将改变显示的消息,而无需编写自己的自定义验证。

@Required(message = "Your message here!")
public String someField;