使用@Pattern 时如何获取经过验证的输入的值?

How to get the value of the validated input when using @Pattern?

我正在使用 @Pattern 验证输入是否匹配 IP 地址:

@Pattern(regexp = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$",message = "Invalid IP Address! {validation.value}")

有没有办法告诉 spring 获取消息中的实际值?

现在我得到:

javax.validation.ConstraintViolationException: controllerMethod.ip: Invalid IP Address! {validation.value}

但是我想要

javax.validation.ConstraintViolationException: controllerMethod.ip: Invalid IP Address! BlaBlaBla 
@Pattern(regexp = "...", message = "Invalid IP Address! ${validatedValue}")

我曾怀疑 Spring 在默认验证消息中解析 SpEL 表达式的能力。

调试时,我设法发现评估上下文知道很多属性,包括 regexppayloadflagsgroupsvalidatedValue,和 message(专门针对 @Pattern)。

您可以将任何这些名称包含在 @Pattern#message 中,方法是用 ${...} 包围名称。

由于 Spring 使用 Hibernate Validator 作为 JSR-303/JSR-349 的默认参考实现,因此值得阅读 Hibernate 文档:Chapter 4. Interpolating constraint error messages.