LWK*_*K69 5 validation spring hibernate
我想为文本字段自定义错误消息,以包括输入的实际字符数。我已经能够使它起作用,但是对我的解决方案不满意,所以我想知道其他人为实现此目的做了什么。
字段注释(出于测试目的,限制为10-实际大小为150)
@Column(name = "NAME", nullable = false)
@Size(max=10)
private String name;
Run Code Online (Sandbox Code Playgroud)
message.properties
Size.person.name=Maximum is {1} characters
Run Code Online (Sandbox Code Playgroud)
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}"> ${nameError}</c:if></label>
<form:input type="text" size="10" class="form-control" id="inputName" placeholder="Name" path="name" autocomplete="off"/>
</div>
Run Code Online (Sandbox Code Playgroud)
输出量
这对于一个字段是可以的,但是我正在处理的表单有10多个具有大小验证的字段。另外,form:input的size =“ 10”设置似乎并没有执行任何操作,即,您仍然可以输入10个以上的字符。
我知道一种选择是编写一个自定义验证器,但这似乎对我想做的事来说太过分了。另一个方法是在发布表单之前捕获错误,但是我试图保留所有验证服务器端。任何建议将不胜感激。
在 Hibernate 文档中有关于插入验证消息的很好的文档:第 4 章。插入约束错误消息。
如果您ValidationMessages.properties在类路径的根目录中创建一个文件,那么您可以在那里更改所有验证消息:
javax.validation.constraints.Size.message=Please enter at least {min} and at most {max} characters.
Run Code Online (Sandbox Code Playgroud)
中的参数{...}只是注释的属性名称。这几乎适用于所有约束。如果要引用经过验证的值,可以使用{validatedValue}. 您也可以使用Formatter来格式化值:
... ${formatter.format('...', validatedValue)} ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,length没有格式字符串。
因此,如果您真的想为所有人提供这样的消息@Size,那么您将必须实现自己的javax.validation.MessageInterpolator(请参阅上面链接中的自定义消息插值)。
附加说明:更改默认验证消息时有副作用:@Size也可用于集合。在那种情况下,至少我的信息是不合适的。我通常为此创建第二条验证消息:
javax.validation.constraints.Size.Collection.message=Please select at least {min} and at most {max} elements.
Run Code Online (Sandbox Code Playgroud)
并在约束中使用那个:
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;
}
Run Code Online (Sandbox Code Playgroud)
使用我的代码样式工具中的匹配规则,我确保不会忘记为@Size集合上的注释定义消息。
| 归档时间: |
|
| 查看次数: |
4618 次 |
| 最近记录: |