java - 自定义 ConstraintValidator Autowire 不起作用
问题描述
我已经从这篇文章中参考了解决将存储库注入自定义约束验证器的问题,但是在花了几个小时之后,我仍然无法将autowire
存储库存储到我的自定义约束验证器中。
我在这里错过了什么吗?我正在使用最新版本的 spring-boot:2.3.1
用户验证器.java
@Component
public class UserValidator implements ConstraintValidator<ValidateUser, User> {
private boolean isValid = true;
@Autowired
private UserRepository userRepository;
BiConsumer<User, ConstraintValidatorContext> registerUserValidator = (user, context) -> {
if (StringUtils.isBlank(user.getUserName())) addError("Username is mandatory", context);
if (StringUtils.isBlank(user.getEmail())) addError("Email ID is mandatory", context);
if (StringUtils.isBlank(user.getPassword())) addError("Password is mandatory", context);
if (StringUtils.isBlank(user.getUserType()))
addError("User Type [Distributor/Investor] is mandatory", context);
if (Optional.of(userRepository.findByEmailAndUserType(user.getEmail(), user.getUserType())).isEmpty())
addError("Email already registered", context);
if (user.getUserType().equals(UserType.Distributor) && Optional.of(userRepository.findByArn(user.getArn())).isPresent())
addError("ARN [" + user.getArn() + "] already registered.", context);
if (user.getUserType().equals(UserType.Investor) && Optional.of(userRepository.findByPan(user.getPan())).isPresent())
addError("PAN [" + user.getPan() + "] already registered.", context);
};
@Override
public boolean isValid(User user, ConstraintValidatorContext context) {
if (user.getAction() == Action.REGISTER_USER) registerUserValidator.accept(user, context);
return isValid;
}
private void addError(String errorMessage, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(errorMessage).addConstraintViolation();
isValid = false;
}
}
验证用户.java
import org.springframework.stereotype.Component;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
@Documented
@Constraint(validatedBy = UserValidator.class)
@Target({METHOD, CONSTRUCTOR, FIELD, PARAMETER, TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @interface ValidateUser {
String message() default "Invalid User";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
用户控制器.java
@RestController
@RequestMapping(path = "/v1/user")
public class UserController {
@Autowired
private ModelValidator validator;
@Autowired
private UserManager userManager;
@PostMapping(value = "")
public ResponseEntity<User> register(@RequestBody User user) {
validator.validate(user, Action.REGISTER_USER);
...
...
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
<properties>
<java.version>11</java.version>
<boot.version>1.4.0.RELEASE</boot.version>
<swagger.version>2.9.2</swagger.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
验证配置.java
import org.hibernate.validator.HibernateValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
@Configuration
public class ValidationConfig {
@Bean
public Validator validator(@Autowired AutowireCapableBeanFactory autowireCapableBeanFactory) {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()
.constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}
用户.java
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.maruti.mfm.validator.ValidateUser;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ValidateUser
@Document
public class User extends BaseEntity {
解决方案
推荐阅读
- php - preg_match_all,查找所有包含特殊字符的精确匹配实例,例如 *** 并添加类
- thunderbird - gFolderDisplay 和其他未在 Thunderbird 后台脚本中定义的内置全局变量
- c - const double *bar = (const double *) foo;?
- r - 如何将多个整数绑定到一个向量中
- excel - 在 Excel 中将宏作为 VBA 事件运行
- python - 如何在 Windows 10 上安装 psycopg2?
- c - 如何在结构中分配内存使其连续
- html - 同时在 HTML 和 CSS 规则中的 style 标签
- java - 休眠会话不更新实体
- node.js - heroku 构建失败。"mongoUrl"://"mongodb........" 语法错误等等