首页 > 解决方案 > 使用属性文件常量作为注释值

问题描述

我成功地从我的属性文件/s (i18n) 加载了验证约束的消息,但是当我编写客户端验证时,很明显,消息和约束值的一个来源可以使整个过程不那么麻烦。

简而言之:有没有办法从属性文件中为大小注释加载一个值,例如 20?

@Size(max=20)
private String password;

我试过这样的行:

@Size(max="${constraint.value}")
// or
@Size(max=Integer.valueOf("#{constraint.value}"))

但是该值必须是整数和常数。

Edit1:客户端验证逻辑以单独库的形式重新完成,只是像 (5,10) for (min,max) 这样的值突出。(使用百里香叶)

<script type="text/javascript" xmlns:th="http://www.thymeleaf.org" th:inline="javascript">
    //...
    // reading message from properties file
    /*<![CDATA[*/
        var errMessage = /*[[#{Size.user.userName}]]*/ 'default';
    /*]]>*/

    // adding a constraint to validationObj linked with one <input> element
    validationObj.addSizeConstraint(ft.keyup,5,10,errMessage);
    //...
</script>

Edit2:感谢@Pavel Horal 的评论,我使它像这样工作:

在服务器端:

public static final int USERNAME_MAX_SIZE=20;

@Size(max=USERNAME_MAX_SIZE)
private String userName;

在客户端(或客户端,因为它在服务器端用百里香进行了预处理)我得到这个值是这样的:

<script type="text/javascript" xmlns:th="http://www.thymeleaf.org" th:inline="javascript">
    //...
    /*<![CDATA[*/
        var value =/*[[${T(com.project.FormModel).USERNAME_MAX_SIZE}]]*/ 20;
    /*]]>*/
    //...
</script>

在我看来,这是一个更好的解决方案,因为我将所有值都保留在 javascript 代码之外。谢谢!

标签: spring-bootvalidationproperties-file

解决方案


@Size注释的 max 参数只接受一个整数,所以下面的无论如何都不起作用

@Size(max="${constraint.value}")

另一方面,下面也不起作用"#{constraint.value}"不会从您的属性文件中解析值。也"${constraint.value}"不会在这里工作。

@Size(max=Integer.valueOf("#{constraint.value}"))

对于所有注解,注解参数根据定义应该是常量。所以我实际上无法想象您的问题的潜在解决方案。


推荐阅读