当前位置: 首页 > 知识库问答 >
问题:

我的验证器失败时userRepository尝试保存新用户在数据库

袁泰
2023-03-14

我尝试创建我的验证注释。

当验证失败时,它的工作很好。我收到一条消息。但是当验证通过时,我得到RollbackException。

我在验证注释中做了什么?

我想在用户表中检查一封唯一的电子邮件。因此,我创建了@注释:

package ru.project.domain.validation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Constraint(validatedBy = UniqueEmailValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface UniqueEmail {

    public String message() default "e-mail exist!";

    public Class<?>[] groups() default {};

    public Class<? extends Payload>[] payload() default{};

}

我创建了验证器:

package ru.project.domain.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.springframework.beans.factory.annotation.Autowired;

import ru.project.service.UserService;

public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {

    @Autowired
    private UserService userService;

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && !userService.isEmailAlredyUse(value);
    }

}

当我输入非唯一电子邮件时,我收到消息“电子邮件存在!

但是当我输入唯一的电子邮件时,我收到错误:

2019-07-07 13:14:09.770 ERROR 11680---[io-8080-exec-10]o.h.i.ExceptionMapperStandardImpl: HHH000346:托管刷新过程中的错误[HV000028: isValid调用期间意外异常。] 2019-07-07 13:14:09.777 ERROR 11680---[io-8080-exec-10]o. a. c. c. C.[.[.[ /].[调度服务器]: servlet的Servlet.service()与路径[]抛出异常[请求处理失败;嵌套异常org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常javax.persistence.RollbackException:提交事务时出错]具有根本原因

java.lang.NullPointerException: null at ru.project.domain.验证.uniqueEmailValidator.isValid(唯一电子邮件验证器.java:17) ~[类/:na] 在 ru.project.domain.validation.uniqueEmail验证器.isValid(UniqueEmailValidator.java:1) ~[类/:na] 在 org.hibernate.验证器.internal.engine.constraint验证.约束树.验证单一主属性(约束树.java:171) ~[Hibernate验证程序-6.0.17.final.jar:6.0.17.Final]组织.Hibernate.验证器.内部.engine.约束验证.简单约束树.验证约束(简单约束树.java:68) ~[Hibernate验证器-6.0.17.最终.jar:6.0.17.Final] 在 org.Hibernate.验证器.内部.引擎.约束验证.约束树.验证约束(约束树.java:73) ...

该函数是验证调用两次。在表单上按下按钮后验证时,以及当用户存储库尝试保存新用户时。

我将显示调试器每次显示给我的内容。

更新:isEmail已使用:

public boolean isEmailAlredyUse(String value) {
        User user = userRepository.findByEmail(value);
        if(user != null) {
            return true;
        }
        return false;
    }

共有2个答案

辛弘壮
2023-03-14

试试这个:

@Email(message="Please provide a valid email address")
@Pattern(regexp=".+@.+\\..+", message="Please provide a valid email address")
@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ExtendedEmailValidator {
    String message() default "Please provide a valid email address";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

如何使用它?在您的实体中添加以下内容:

    @Column
    @ExtendedEmailValidator(message = "custom message")
    private String email;

在您的@Controller中尝试一下:

@PostMapping
public ModelAndView createNewUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
ModelAndView modelAndView = new ModelAndView();
User userExists = userService.findUserByEmail(user.getEmail());

if (userExists != null) {
  bindingResult
               .rejectValue("email", "error.user",
                            "There is already a user registered with the email provided");
}

if(bindingResult.hasErrors()){
    modelAndView.setViewName("registration");
    return modelAndView;
}

/*
Other code
*/
}
公孙嘉禧
2023-03-14

一个决定是当hibernate在数据库中保存一个实体时关闭检查。为此,您需要在应用程序中设置下一个属性

spring . JPA . properties . javax . persistence . validation . mode = none

 类似资料:
  • 我在编写新的Joomla组件时遇到问题。我的自定义joomla组件中有一些输入表单(/components\com\u custom\views\myview\tmpl\default.php) 当然,在最上面我有这个: 我的观点是,如果用户在验证中失败,则保留用户post数据,这样他们就不需要重新键入所有表单,他们只需要在再次提交之前修复一些错误数据,但没有成功。你能帮我一下吗?非常感谢你!

  • 在使用postman创建新用户时,我收到以下错误: 创建新用户失败:验证失败:名字不能为空,电子邮件不能为空,电子邮件无效;参数:{: email= 邮递员的错误: 我正在将以下值传递给邮递员中的参数: 这是用户注册的功能:

  • 已解决:我在家里添加了. pgpass。 我有一句话: 在/etc/postgresql/9.4/main/pg_hba.conf中,但运行时: 我得到: pg_dump:[archiver(db)]与数据库“dbase”的连接失败: 致命:用户“postgres”的对等身份验证失败

  • 我有一个API在Apache堆栈上运行,使用Java。我继承了一个遗留代码库,需要找到这个错误来自哪里显然是上一个开发人员构建了一个不能工作的特性,这就是错误所在,但没有更多信息。它使用Drupal webservice模块,发送调用的代码如下所示 我可以从哪里开始寻找这个错误,或者它可能意味着什么,你有什么想法吗? 完整的堆栈跟踪如下所示::: 用户失败:null。java.lang.Unsup

  • 问题内容: 我已经将jenkins的Subversion插件更新到了2.2版 现在,对于升级后首次构建的存储库以及外部外部某些内容发生更改的存储库,我会收到以下错误。它可以按预期用于所有其他构建。 我试图添加其他凭据,但这没有帮助。 现在,我希望有人对此有个想法,可以尝试解决此问题。 错误: 问题答案: 在对正式的错误报告进行了多次评论之后,我们可以解决此问题。 因此,要使其正常工作,您必须更新到

  • 我已经设置了一个LDAP自定义身份验证提供程序,类似于这里的示例-https://www.baeldung.com/spring-security-authentication-provider 有一个登录控制器来处理登录错误,并检查用户是否在已批准的列表中。控制器调用自定义身份验证提供程序,即authenticationManager。authenticate()方法。 如果提供了错误的凭据,将