我正在使用hib验证来验证从Quarkus REST API中的请求接收到的实体。我正在尝试通过使用User
实体的 * password * 字段的@Pattern
注解来添加快速简单的密码验证以创建用户。
@Entity
@Table(name = "users")
public class User extends BaseEntity {
public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;
public static final String PASSWORD_PATTERN =
"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$";
// other fields...
@Length(min = MIN_PASSWORD_LENGTH, max = MAX_PASSWORD_LENGTH)
@NotBlank(message = "The password field cannot be empty or blank.")
@Pattern(regexp = PASSWORD_PATTERN, message = "The given password does not match the rules.")
@Column(name = "password", length = 256, nullable = false)
private String password;
//get/set...
}
所以我使用的REGEX模式是:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$
这显然对应于:
- 至少一位数字
- 至少一个小写字符
- 至少一个大写字符
- 至少有一个特殊字符(!@#&()-[{}]:;',?/*~$^+=〈〉)
- 长度介于8到20个字符之间
这在https://regex101.com/ for Java REGEX引擎上运行良好,测试密码如下:
什么?
然而,hibvalidator在我的端点中抛出了一个错误,因为它显然不匹配给定的模式。为什么hibvalidator不能正确匹配密码?
(由休眠约束违规异常触发的解析响应):
{
"title": "Constraint Violation",
"status": 400,
"violations": [
{
"field": "password",
"message": "The given password does not match the rules."
}
]
}
1条答案
按热度按时间juzqafwq1#
我的坏家伙们,我发现了这个问题。这不是Hibernate验证器故障。异常是在实体被持久化时引起的,而不是在REST端点之前解析和评估它时。我在将其持久化到端点之前更改了密码字段内容,新值与REGEX不匹配。
我不知道带注解的Hibernate验证也会在持久化之前执行(使用entityManager.persist()),我只是把它看作是解析过程中发生的事情,出于某种奇怪的原因,所以这是我的错。
感谢@mark_o无论如何都能抽出时间!