首页 > 解决方案 > 是否可以手动触发 ConstraintValidationError 以使用其错误模板?

问题描述

在我的 API 项目中,我有一个自定义 ConstraintValidator 来检查电子邮件地址是否尚未与另一个帐户相关联。

界面:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = EmailUniqueConstraintValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EmailUnique {

    String message() default "cannot already be associated with another account";

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

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

验证者:

import com.demo.demoapp.repo.UserRepository;

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


public class EmailUniqueConstraintValidator implements ConstraintValidator<EmailUnique, String> {

    private UserRepository userRepository;


    public EmailUniqueConstraintValidator(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value == null || !userRepository.existsByEmail(value);
    }
}

此验证器被添加到用户创建请求对象中,并且将正确检查电子邮件地址的存在,如果是这种情况,则将错误返回给 BindingResult。

但是当编辑用户时,事情变得更加复杂。除了对象之外,用户对象必须完全传递给 API,因此始终会触发此约束验证器。所以我想从类中删除@EmailUnique 注释并在Service 中手动触发它。那可能吗?

标签: javaspringspring-bootspring-data-jpabean-validation

解决方案


推荐阅读