Hibernate 验证:使用户能够仅输入数字(数字)而不是输入

问题描述 投票:0回答:3

我有一个 jsf 表单,并且有一个通常只接受 number(integer) 的输入。 我想自定义当用户在此字段中输入字符串或字符时的错误消息。我想要在数据层中进行验证,这意味着休眠注释。 如果用户输入字符串而不是整数,我不想使用此默认消息,我想使用自定义错误消息。

:“10S”必须是 -2147483648 和 2147483647 之间的数字示例: 9346

请附上图片可以很好地解释。 请问我怎样才能实现这个目标。

提前谢谢您。

java hibernate bean-validation hibernate-validator
3个回答
0
投票

您应该实现自己的 javax.validation.MessageInterpolator

(来自 https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-validator-factory-message-interpolator

验证引擎使用消息插值器来创建用户 来自约束消息描述符的可读错误消息。

如果默认消息插值算法中描述 第 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();

0
投票

您可以使用@Range注释来实现这一点

@Range(min = -2147483648, max = 2147483647, message= ": '10S' must be a number between -2147483648 and 2147483647 Example: 9346")
long value;

0
投票

我假设 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";
}
© www.soinside.com 2019 - 2024. All rights reserved.