Hibernate Validator 第12篇:缺省的内插约束错误信息

本文详细介绍了Hibernate Validator的默认消息内插器,包括特殊字符转义、内插消息表达式及其在错误消息中的应用。通过解析约束违反时的消息描述器,解释了如何在验证失败时自定义错误信息,特别是如何利用EL表达式实现动态错误消息,并提供了多个示例进行说明。
摘要由CSDN通过智能技术生成

消息插值是为违反Jakarta Bean验证约束创建错误消息的过程。在本篇文章中,你将了解如何定义和解析这些消息,以及在默认的方法不能满足您的需求时,如何自定义消息内插器。

一、缺省的消息内插器

约束违反消息来源于所谓的消息描述器。每个约束使用这个message属性,定义它自己的消息描述器。

在声明的时候,这个缺省的描述器可以通过一个指定的值,被重写。看下面例子:

public class Car {
   

    @NotNull(message = "The manufacturer name must not be null")
    private String manufacturer;
}

如果一个约束被违反,它的描述器会被验证引擎使用的当前配置的MessageInterpolator插入。这个插入的错误消息可以通过调用ConstraintViolation#getMessage()方法,从产生的约束违例中检索。

消息描述器可以包含容器参数,也可以包含消息表达式,它们可以在插入期间被解析。消息参数是字符串常量,存放在{}中,而消息表达式是字符串常量,并被包含在${}中使用。

下面的算法在方法插入期间被应用。

  • 使用任何消息参数作为资源包ValidationMessages的键来解析它们。如果这个包包含一个给定的消息参数的实体,那么这个参数可以应用在相关的资源包中的值中。这一步可以被递归的执行以代替约束中的消息参数。这个资源包是开发者提供,因此,通过增加一个名为ValidationMessage.properties在类路径中。你也可以创建一个本地的错误消息,通过提供一个这个包的特定地区变体,例如ValidationMessages_en_US.properties. 如果不设置的话,这个JVM的默认的局部的(Locale#getDefault)将会被使用,在包中寻找消息。
  • 使用任何消息参数作为资源包ValidationMessages的键来解析它们,资源包包含标准的错误信息,在内建约束中被定义在附录B中,在Jakarta Bean Validation 规范中。在Hibernate Valdiator,这个资源包叫做org.hibernate.validator.ValidationMessages. 如果这一步触发了一个替换,步骤一会被再次执行,否则步骤三会被应用。
  • 解析任何消息参数,使用约束注解中相同名字的值替换他们的值。这允许推断约束中属性的值(例如,Size#mis())在错误消息中(例如必须至少大于${min})。
  • 解析任何消息表达式,解析他们使用统一表达式语言。

1.1 特殊字符

既然这个“{”,"}“和”$"有一个特殊的含义,在消息表达器中。如果你想按字面意思使用它们,那么它们需要被转义。下面的规则可以使用:

  • “\{”可以认为是"{"
  • “\}”可以认为是"}"
  • \$可以认为是$
  • \\可以认为是\

1.2 内插消息表达式

由于Hibernate Validator5(Bean Validation 1.1),它可以使用Jakarta 表达式语言,在约束消息中。这允许基于条件逻辑和使用高级的形式定义错误消息。这个验证引擎使下面的选项有效在EL(表达式语言)环境中。

  • 属性值和属性的名字映射对应起来。
  • 当前的校验的值(属性,bean,方法参数等等)在名为validatedValue下面。
  • 一个bean映射了一个名字格式器,通过解析一个参数方法format(String format, Object… args),它表现的就像java.util.Format.format(String format, Object…args).
  • 下面的部分,提供了一些使用EL表达式的例子,在错误信息中。

1.3 例子


package org.hibernate.validator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值