【问题标题】:How to customize Hibernate @Size error message to indicate length of entered field如何自定义 Hibernate @Size 错误消息以指示输入字段的长度
【发布时间】:2015-08-02 15:46:01
【问题描述】:

我想自定义文本字段的错误消息以包含输入的实际字符数。我已经能够让它工作,但对我的解决方案不满意,所以我想知道其他人做了什么来完成这个。

  • 春季 4.1.2
  • 休眠 4.3.10
  • 休眠验证器 5.1.3

Field Annotation(限于 10 个用于测试目的 - 实际大小为 150 个)

@Column(name = "NAME", nullable = false)
@Size(max=10)
private String name;

message.properties

Size.person.name=Maximum is {1} characters

JSP 代码

    <spring:bind path="person.name">
        <c:set var="nameError">${status.errorMessage}</c:set>
        <c:set var="nameDisplayValue">${status.displayValue}</c:set>
        <c:set var="nameCode">${status.errorCode}</c:set>
    </spring:bind>
    <c:if test="${fn:contains(nameCode,'Size')}">
        <c:set var="nameLen">${fn:length(nameDisplayValue)}</c:set>
        <c:if test="${nameLen gt 0}">
            <c:set var="nameError">${nameError += " (you entered " += nameLen += ")"}</c:set>  
        </c:if>
    </c:if>

    <div class="form-group col-sm-9 <c:if test="${not empty nameError}">has-error</c:if>">
        <label class="control-label" id="nameLabel" for="inputName">Name:<c:if test="${not empty nameError}">&nbsp;&nbsp;${nameError}</c:if></label>
        <form:input type="text" size="10" class="form-control" id="inputName" placeholder="Name" path="name" autocomplete="off"/>                                                           
    </div>

输出

这对于一个字段来说是可以的,但我正在处理的表单有超过 10 个具有大小验证的字段。此外,form:input 的 size="10" 设置似乎实际上并没有做任何事情,也就是说,您仍然可以输入超过 10 个字符。

我知道一种选择是编写一个自定义验证器,但这对于我想做的事情来说似乎有点过头了。另一个是在表单发布之前捕获错误,但我试图将所有验证服务器端保留。任何建议将不胜感激。

【问题讨论】:

    标签: spring hibernate validation


    【解决方案1】:

    在 Hibernate 文档中有一个很好的关于插入验证消息的文档:Chapter 4. Interpolating constraint error messages

    如果您在类路径的根目录中创建一个文件 ValidationMessages.properties,那么您可以在那里更改所有验证消息:

    javax.validation.constraints.Size.message=Please enter at least {min} and at most {max} characters.
    

    {...}中的参数只是注解的属性名。这几乎适用于所有约束。如果要引用验证值,可以使用{validatedValue}。您也可以使用Formatter 来格式化值:

    ... ${formatter.format('...', validatedValue)} ...
    

    很遗憾,length 没有格式字符串。

    因此,如果您真的想为所有@Size 提供这样的消息,那么您将必须实现自己的javax.validation.MessageInterpolator(请参阅上面链接中的自定义消息插值)。 p>

    补充说明:更改默认验证消息时有一个副作用:@Size 也可用于集合。在那种情况下,至少我的信息是不合适的。我通常为此创建第二条验证消息:

    javax.validation.constraints.Size.Collection.message=Please select at least {min} and at most {max} elements.
    

    并在约束中使用那个:

    public final class ValidationMessages {
      public static final String COLLECTION_SIZE = 
          "javax.validation.constraints.Size.Collection.message";
    }
    
    public class MyClass {
        @Size(min = 1, max = 10, message = ValidationMessages.COLLECTION_SIZE)
        private Collection<String> elements;
    }
    

    通过我的代码样式工具中的匹配规则,我确保不会忘记为集合上的 @Size 注释定义消息。

    【讨论】:

    • 关于收藏的好点子。但我正在寻找的是一个附加参数,它将显示输入字符的实际数量。 Size.recipe.name=Maximum is {max} characters (you entered {length})
    • 对不起,在挖掘我的代码后忘记了这一点。我现在已经添加了。
    • 感谢您的回复。我浏览了很多帖子,如果我想在服务器端执行此操作,恐怕您对实现自定义插值器可能是正确的。
    • @LWK69 如果你有答案,我很想知道你是如何解决这个问题的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多