+-
spring – 如何自定义Hibernate @Size错误消息以指示输入字段的长度
我想自定义文本字段的错误消息,以包括输入的实际字符数.我已经能够让这个工作起来但我对我的解决方案不满意,所以我想知道其他人为实现这个目标做了些什么.

>春季4.1.2
> Hibernate 4.3.10
> Hibernate Validator 5.1.3

字段注释(限于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>

产量

enter image description here

这对于一个字段是可以的,但我正在处理的表单有超过10个具有大小验证的字段.此外,form:input的size =“10”设置似乎没有实际执行任何操作,即您仍然可以输入10个以上的字符.

我知道一个选项是编写一个自定义验证器,但这对我想做的事情来说似乎有些过分.另一种方法是在发布表单之前捕获错误,但我正在尝试保留所有验证服务器端.任何建议将不胜感激.

最佳答案
在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)} ...

不幸的是,长度没有格式字符串.

因此,如果你真的想要为所有@Size提供这样的消息,那么你将不得不实现自己的javax.validation.MessageInterpolator(参见上面链接中的自定义消息插值).

补充说明:更改默认验证消息时会产生副作用:@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注释的消息.

点击查看更多相关文章

转载注明原文:spring – 如何自定义Hibernate @Size错误消息以指示输入字段的长度 - 乐贴网