Java 是否可以使自定义验证注释在持久化时被忽略?
我使用Spring4和Hibernate5 我有自定义验证器的用户类和密码字段 我需要在表单绑定时验证它,使其长度为8个字符,包括小写和大写字母以及数字 当用户输入密码时,它是有效的,但当我对它进行编码时它是无效的 那么有没有办法让我的自定义验证注释在持久化时被忽略? 我知道我可以为未加密的密码创建不同的字段,或者创建数据传输对象,验证它,然后将它的数据传给用户。 但我对注释参数化的可能性感兴趣Java 是否可以使自定义验证注释在持久化时被忽略?,java,spring,hibernate,validation,persistence,Java,Spring,Hibernate,Validation,Persistence,我使用Spring4和Hibernate5 我有自定义验证器的用户类和密码字段 我需要在表单绑定时验证它,使其长度为8个字符,包括小写和大写字母以及数字 当用户输入密码时,它是有效的,但当我对它进行编码时它是无效的 那么有没有办法让我的自定义验证注释在持久化时被忽略? 我知道我可以为未加密的密码创建不同的字段,或者创建数据传输对象,验证它,然后将它的数据传给用户。 但我对注释参数化的可能性感兴趣 @Entity @Table(name = "user") public class User {
@Entity
@Table(name = "user")
public class User {
//other fields
@NotNull
@NotEmpty
@ValidPassword
@Column(name = "password", nullable = false, length = 60)
private String password;
//getters and setters
}
我的验证器
@Target({ TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
@Documented
public @interface ValidPassword {
String message() default "Password is too short! Must be 8 digits and include lowercase, uppercase letters and numbers.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
UserService实现方法(其中我对密码进行编码)
@Transactional
@凌驾
公共用户RegisterNewSerAccount(用户用户)引发EmailExistsException{
if(emailExist(user.getEmail())){
抛出新的EmailExistsException(“有一个帐户的电子邮件地址:“+user.getEmail()”);
}
if(user.getPassword()==null){
user.setPassword(新的BigInteger(130,新的SecureRandom()).toString(32));
System.out.println(“+user.getPassword());
}
user.setPassword(passwordEncoder.encode(user.getPassword());
setUserRole(新的HashSet(1));
user.getUserRole().add(新用户角色(user,Constants.RoleType.user.name());
保存(用户);
返回用户;
}
默认情况下,将对所有约束进行验证。或者您可以指定
您可以通过创建接口来创建组:
interface FormValidationGroup{}
并对密码
字段进行如下注释:
@ValidPassword(groups = FormValidationGroup.class)
private String password;
其中提到了组
参数的文档
Hibernate Validator现在应该忽略密码
字段,除非您指定要验证的组。要指定用于验证Spring MVC处理程序方法参数的组,请使用注释而不是Valid
。例如:
String registerUser(@ModelAttribute @Validated(FormValidationGroup.class) User user,
BindingResult result, Model model) {
if (result.hasErrors()) {
“当我编码它时,它是无效的”,确切地说,你在代码中的什么地方得到了这个错误?一个月前我遇到了这样一个场景,当时我只想在persist上运行验证。请参阅:。您必须将验证设置为在“javax.persistence.validation.group.pre-update”(以及可能的“javax.persistence.validation.group.pre-remove”)期间执行。请参阅此处的完整文档:@zaph当用户输入正确的密码时,它有8位数字,以此类推,当我使用
passwordEncoder.encode(user.getPassword())
对它进行编码时,它现在要长很多(例如:$2a$10$3/ufbdu3qmnn7e3iq7hkjubrjrd7kkieqflkedvz8b7dy8eucu),因此验证fails@TomerA我需要对表单绑定进行验证,与您想要的相反,密码是通过对其应用相同的函数并验证结果是否与DB条目相同来验证的。她在amble$2a$10$
之前的文章中介绍了它是如何生成的。这很有用。但是我如何使我的自定义组在表单绑定上得到验证,这样我就可以使用BindingResulthasErrors()
方法了?我更新了我的答案,以说明如何使用Spring MVC和BindingResult
interface FormValidationGroup{}
@ValidPassword(groups = FormValidationGroup.class)
private String password;
String registerUser(@ModelAttribute @Validated(FormValidationGroup.class) User user,
BindingResult result, Model model) {
if (result.hasErrors()) {