Tom*_*r A 4 java validation hibernate jsr bean-validation
我们遇到了遗留代码问题。有一个用于“用户名”字段的验证集,用于验证其长度并确保其至少包含一个字母:
@Column(name = "username")
@Size(min = 4, max = 40)
@Pattern(regexp = "^.*[a-zA-Z]+.*$")
private String username;
Run Code Online (Sandbox Code Playgroud)
我们面临的问题是,一些现有的旧数据不适合这些验证,我正在尝试找到一种方法,使旧数据(旧用户)可以忽略这些验证,同时仍将这些验证应用于新创建的用户。
我正在考虑将验证移至setUsername(...)方法(因此将仅在实际更改时验证值),但这导致了异常:
javax.validation.ValidationException: Annotated methods must follow the JavaBeans naming convention. setUsername() does not.
Run Code Online (Sandbox Code Playgroud)
我还确保将实体设置为dynamicUpdate=true,但这无济于事,因为hibernate会验证所有属性,即使没有发生更改也是如此。
如何防止在更新过程中对现有实体执行这些验证?
我不希望该修复程序影响同一实体上的其他属性验证,并且我无法更改休眠配置。
经过两天的研究,我发现了如何进行这项工作。
显然,指定INSERT仅在其上进行验证的验证并不是那么困难。唯一需要做的更改是将这些验证设置为一个特定的验证组,并在INSERT/ pre-persist事件期间对该组进行验证。
首先,我创建了一个称为platform.persistence.InsertOnlyValidations组的接口,该接口将仅在预持久化期间进行验证。
然后,我将该组添加到了username现场验证中:
@Column(name = "username")
@Size(min = 4, max = 40, groups = {InsertOnlyValidations.class})
@Pattern(regexp = "^.*[a-zA-Z]+.*$", groups = {InsertOnlyValidations.class})
private String username;
Run Code Online (Sandbox Code Playgroud)
这指示休眠状态不要将这些验证用作默认组的一部分。现在,我需要指示休眠模式仅在插入期间验证这些验证规则。
这样做的方法非常简单,我需要传递property javax.persistence.validation.group.pre-persist,同时指示在pre-persist事件期间将验证哪些组:
javax.persistence.validation.group.pre-persist=javax.validation.groups.Default,platform.persistence.InsertOnlyValidations
Run Code Online (Sandbox Code Playgroud)
这指示休眠状态,在pre-persist事件期间javax.validation.groups.Default,除InsertOnlyValidations组中包括的所有验证之外,还将验证所有默认验证()。
| 归档时间: |
|
| 查看次数: |
1395 次 |
| 最近记录: |