Java 是否可以使自定义验证注释在持久化时被忽略?

Java 是否可以使自定义验证注释在持久化时被忽略?,java,spring,hibernate,validation,persistence,Java,Spring,Hibernate,Validation,Persistence,我使用Spring4和Hibernate5 我有自定义验证器的用户类和密码字段 我需要在表单绑定时验证它,使其长度为8个字符,包括小写和大写字母以及数字 当用户输入密码时,它是有效的,但当我对它进行编码时它是无效的 那么有没有办法让我的自定义验证注释在持久化时被忽略? 我知道我可以为未加密的密码创建不同的字段,或者创建数据传输对象,验证它,然后将它的数据传给用户。 但我对注释参数化的可能性感兴趣 @Entity @Table(name = "user") public class User {

我使用Spring4和Hibernate5

我有自定义验证器的用户类和密码字段

我需要在表单绑定时验证它,使其长度为8个字符,包括小写和大写字母以及数字

当用户输入密码时,它是有效的,但当我对它进行编码时它是无效的

那么有没有办法让我的自定义验证注释在持久化时被忽略?

我知道我可以为未加密的密码创建不同的字段,或者创建数据传输对象,验证它,然后将它的数据传给用户。 但我对注释参数化的可能性感兴趣

@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$
之前的文章中介绍了它是如何生成的。这很有用。但是我如何使我的自定义组在表单绑定上得到验证,这样我就可以使用BindingResult
hasErrors()
方法了?我更新了我的答案,以说明如何使用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()) {