我目前正在学习Spring Boot framework,并试图按照baledung页面上的指南创建一个自定义字段匹配验证器。
我的代码实际上和上面的页面一样,唯一不同的是我用BCryptPasswordEncoder编码了密码。
这是我的用户类。
@FieldsValueMatch.List({
@FieldsValueMatch(
field = "password",
fieldMatch = "verifyPassword",
message = "Passwords do not match!"
)
})
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "User")
public class User implements UserDetails {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
@NotEmpty(message = "{firstname.notempty}")
private String firstname;
@Column(nullable = false)
@NotEmpty(message = "{lastname.notempty}")
private String lastname;
@Column(nullable = false,unique = true)
@NotEmpty(message = "{email.notempty}")
@Email(message = "{email.notwellformed}")
private String email;
@Column(nullable = false)
@NotEmpty(message = "{password.notempty}")
@ValidPassword
private String password;
@NotEmpty(message = "{verifyPassword.notempty}")
@Transient
private String verifyPassword;
控制器:
@PostMapping("/sign-up")
String signUp(@Valid User user, BindingResult bindingResult) {
if (userService.userExists(user.getEmail())){
bindingResult.rejectValue("email", "email.alreadyexists");
}
if(bindingResult.hasErrors()){
return "sign-up";
}
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userService.signUpUser(user);
return "redirect:/sign-in";
}
注册用户方法:
public void signUpUser(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepository.save(user);
final ConfirmationToken confirmationToken = new ConfirmationToken(user);
confirmationTokenService.saveConfirmationToken(confirmationToken);
sendConfirmationMail(user.getEmail(), confirmationToken.getConfirmationToken());
}
我收到了以下错误:
javax.validation.ConstraintViolationException: Validation failed for classes [com.project.project.entity.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='Passwords do not match!', propertyPath=verifyPassword, rootBeanClass=class com.project.project.entity.User, messageTemplate='Passwords do not match!'}
ConstraintViolationImpl{interpolatedMessage='Password must be no more than 30 characters in length.', propertyPath=password, rootBeanClass=class com.project.project.entity.User, messageTemplate='Password must be no more than 30 characters in length.'}
]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:80) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.action.internal.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:188) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:78) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:760) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
我认为编码的密码正在与未编码的验证密码进行比较。这就是为什么我收到这个错误或?我怎么才能修好它?如果我也编码的验证密码,我仍然得到的错误。
提前谢谢。
30个字符的长度通常表示系统用户应键入长度不超过30个字符的密码。然而,当系统编码时,输入的密码将具有不同的长度。
发生此错误是因为用于映射数据库实体的用户具有密码不超过30个字符的验证约束。对密码进行编码的过程可以修改密码的原始长度。因此发生错误。
您应该创建另一个类UserDto
,该类可以从控制器访问,并将表示控制器类和输入密码的系统实际用户之间交换的信息。这个新的UserDto
可以有30个字符的约束,而User
类的数据库表示可以没有这种约束,因为在数据库中,密码将以不同的长度存储。
因此,您将使用UserDto
类验证用户对系统的输入,并使用user
类按照相对表的结构映射java对象中的数据库记录。
主要内容:创建密码字段,示例用于密码输入。用户键入的字符通过显示回显字符串被隐藏。 创建密码字段 以下代码使用来自类的默认构造函数创建一个密码字段,然后为密码字段设置提示消息文本。 提示消息在字段中显示为灰色文本,并为用户提供该字段是什么的提示,而不使用标签控件。 类有方法来为控件设置文本字符串。对于密码字段,指定的字符串由回显字符隐藏。默认情况下,回显字符是一个点(或是星号)。 密码字段中的值可以通过方法获取。 示例 密码
大家好,我正在尝试匹配以下正则表达式: 最少字符数:8 最大字符数:22 最小大写字母:1 最小小写字母:1 最小位数:2 允许使用特殊字符 第一个字符必须是字母 最大连续相同字符数:2 我已经设法完成了每一个条件,但连续的条件是: 遵循后正则表达式不超过2个相同的连续字符和a-Z和0-9,我发现不匹配精确字符的方法是: 但是我无法混合它们并获得完整的匹配结果。尝试在这里完成:https://re
我的密码应类似于: “密码应包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符,长度至少为八个字符” 我使用的模式是:
编辑:FXML文件
我试图验证一个没有任何成功...我说错了吗?和验证是可以的,但不是 使用VeeValidate HTML 脚本