【问题标题】:Bean Validation Min/Max wrong messageBean Validation Min/Max 错误信息
【发布时间】:2014-10-08 11:55:38
【问题描述】:

我正在使用最小/最大 Beanvalidation。这是一个例子:

@Min(value = 100, message="too low")
@Max(value = 1000, message="too high")
private Integer example;

如果我输入99,我会收到正确的消息"too low"。如果我输入1001,我也会收到正确的消息"too high"。如果我输入一个非常高的数字,例如10000000000 我收到一条通用消息,我发现这是一条消息:javax.faces.converter.BigIntegerConverter.BIGINTEGER={2}。所以我怀疑如果用户输入的数字大于实际字段类型,他会收到另一条消息。

这实际上不是我想要实现的。我总是想向用户展示"too high"。有没有办法做到这一点?

【问题讨论】:

    标签: jsf-2 bean-validation


    【解决方案1】:

    实际上有两件事发生,转换和验证。在第一步中,JSF 需要获取您的字符串输入并将其转换为数字。这是你得到错误的地方。您的值不能转换为整数。如果转换有效,JSF 会填充您的模型,这就是验证开始的地方。如果验证失败,您将获得定义的 Bean 验证消息。那么你能做什么:

    • 将 javax.faces.converter.BigIntegerConverter.BIGIINTEGER={2} 的 JSF 消息配置为更具描述性
    • 更改数据类型,例如使用 BigInteger。在这种情况下,从字符串到数字的转换将起作用
    • 在 bean 中使用字符串并验证字符串。不过,您可能需要在不同的时间点转换为数字,但这取决于您的用例。

    【讨论】:

      【解决方案2】:

      java 中的maximum for Integer 是 2^31,刚刚超过 21 亿。您使用的输入 100 亿超出了整数的最大值,并且会溢出字段,因此无论您是否进行了任何验证,在给定字段类型的情况下,它都是无效的。您可以将字段类型切换为 BigInteger,然后 override the default validation messages 以满足您的需求,但考虑到您的问题的目的,这可能是过度的。您还可以有自定义消息

      【讨论】:

      • 仅仅为了验证工作而改变字段的类型并不是正确的方法。自定义消息是什么意思?我已经在注释中使用了自定义消息。感觉很奇怪,因为 100 亿实际上是一个很高的数字。
      • 您可以使用资源包覆盖默认验证器消息。所以将 BigInteger {2} 消息设置为“太高”
      【解决方案3】:

      例如,为什么不限制前端输入字段中的字符数量,例如

      <h:inputText maxlength="4"/>
      

      我猜如果你真的想绕过它是可能的,但我不会太担心有人入侵网站的可用性:-)

      【讨论】:

      • 这实际上是一个好主意。我会建议这个解决方案谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多