我有一个 jsf 表单,并且有一个通常只接受 number(integer) 的输入。 我想自定义当用户在此字段中输入字符串或字符时的错误消息。我想要在数据层中进行验证,这意味着休眠注释。 如果用户输入字符串而不是整数,我不想使用此默认消息,我想使用自定义错误消息。
:“10S”必须是 -2147483648 和 2147483647 之间的数字示例: 9346
请附上图片可以很好地解释。 请问我怎样才能实现这个目标。
提前谢谢您。
您应该实现自己的 javax.validation.MessageInterpolator
验证引擎使用消息插值器来创建用户 来自约束消息描述符的可读错误消息。
如果默认消息插值算法中描述 第 4 章,插入约束错误消息是不够的 根据您的需要,您可以传递您自己的实现 通过 Configuration#messageInterpolator() 实现 MessageInterpolator 接口
如下例所示:
package org.hibernate.validator.referenceguide.chapter09;
public class MyMessageInterpolator implements MessageInterpolator {
@Override
public String interpolate(String messageTemplate, Context context) {
//...
return null;
}
@Override
public String interpolate(String messageTemplate, Context context, Locale locale) {
//...
return null;
}
}
您可以将验证器配置为使用自定义插值器,如下所示:
ValidatorFactory validatorFactory = Validation.byDefaultProvider()
.configure()
.messageInterpolator( new MyMessageInterpolator() )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
您可以使用@Range注释来实现这一点
@Range(min = -2147483648, max = 2147483647, message= ": '10S' must be a number between -2147483648 and 2147483647 Example: 9346")
long value;
我假设 JSF 表单数据已经映射到 POJO,这里是您可以使用 SpELScriptAssert 实现您想要的行为的示例。顺便说一句,我是这个库的作者。
@SpELScriptAssert(
script = "input instanceof T(Integer)",
message = "'#{input}' must be a number between #{T(Integer).MIN_VALUE} and #{T(Integer).MAX_VALUE} Example: 9346")
public class Form {
public Object input = "10S";
}