Я взял ссылку для решения проблемы внедрения репозитория в Custom ConstraintValidator из этого сообщения , однако, потратив несколько часов, я все еще не могу добавить autowire
репозиторий в свой собственный валидатор ограничений. 1004 *
Я что-то упустил? Я использую последнюю версию spring -boot: 2.3.1
UserValidator. 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;
}
}
ValidateUser. 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 {};
}
UserController. 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);
...
...
пом. 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>
ValidationConfig. 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 {