有错误validationmessage不显示_Hibernate Validator 第12篇:缺省的内插约束错误信息

本文深入探讨了Hibernate Validator中错误消息的创建过程,即消息插值。介绍了如何定义和解析约束违反消息,以及在默认机制无法满足需求时如何自定义消息内插器。内容涵盖缺省消息内插器的工作原理、特殊字符转义、内插消息表达式及其在错误消息中的应用实例。
6e3ccf47ff23cb272a7bfa2e0041bb4c.png

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

一、缺省的消息内插器

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

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

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

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

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

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

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

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.referenceguide.chapter04.complete;public class Car {  @NotNull  private String manufacturer;   @Size(  min = 2,  max = 14,  message = "The license plate '${validatedValue}' must be between {min} and {max} characters long" )  private String licensePlate;   @Min(  value = 2,  message = "There must be at least {value} seat${value > 1 ? 's' : ''}" )  private int seatCount;   @DecimalMax(  value = "350
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值