【问题标题】:Hibernate validation: give the ability to user to only enter a digits(number) not instead休眠验证:使用户能够只输入数字(数字)而不是
【发布时间】:2017-11-27 13:17:38
【问题描述】:

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

: '10S' 必须是介于 -2147483648 和 2147483647 之间的数字 示例: 9346

请附图可以很好地解释。 请问我怎样才能做到这一点。

提前谢谢你。

【问题讨论】:

标签: java hibernate bean-validation hibernate-validator


【解决方案1】:

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

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

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

如果使用中描述的默认消息插值算法 第 4 章,插入约束错误消息是不够的 根据您的需要,您可以传入自己的实现 MessageInterpolator 接口通过 Configuration#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();

【讨论】:

  • 在这种情况下看起来是多余的。为什么不使用开箱即用的解决方案,例如:@NotNull(message = "The manufacturer name must not be null")
  • 看起来很难实现这样的自定义消息
【解决方案2】:

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

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

【讨论】:

  • 糟糕,抱歉。我误解了这个问题。我现在明白你的意思,稍后我会更新我的问题。
猜你喜欢
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2014-09-18
相关资源
最近更新 更多