如果该类被标记为@Validated,那么至少有一个字段标记有我的自定义注释的实体@Unique将被检查两次。此外,第一次验证器将有一个注入的上下文和服务,第二次一切都将为空。在我看来,由于@Validated实体被检查了两次,但我不明白为什么,甚至为什么没有注入的上下文和服务?
如果未标记该类,则即使使用我的自定义注释,也可以很好地签出实体。但是参数验证不起作用,例如,publicString someFunction (@RequestParam ("email") @Email String email)如果您明确发送的不是电子邮件地址,那么一切都将转到服务,但@Validated在课堂上它已经给出了电子邮件不合适的消息。
为注解服务的类
public class UniqueValidator implements ConstraintValidator<Unique, Object> {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private FieldValueExists service;
private String fieldName;
@Override
public void initialize(Unique unique) {
Class<? extends FieldValueExists> clazz = unique.service();
this.fieldName = unique.fieldName();
String serviceQualifier = unique.serviceQualifier();
if (!serviceQualifier.equals("")) {
this.service = this.applicationContext.getBean(serviceQualifier, clazz);
} else {
this.service = this.applicationContext.getBean(clazz);
}
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
return !this.service.fieldValueExists(o, this.fieldName);
}
}
注解
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueValidator.class)
public @interface Unique {
String message() default "Field is not unique";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends FieldValueExists> service() default FieldValueExists.class;
String serviceQualifier() default "";
String fieldName();
}
来自实体的一段代码,其字段由我的验证器验证
@JsonRootName("userCreate")
public class UserModelCreateDto {
@Size(min = 4, max = 32)
@NotBlank
@Unique(fieldName = "login", serviceQualifier = "userServiceImpl")
private String login;
控制器
@RestController
@Validated
public class AuthenticationController {
private static Logger LOG = Logger.getLogger(AuthenticationController.class);
@Autowired
private UserService userService;
@Autowired
private ModelMapper modelMapper;
@PostMapping("/sign-up")
@ResponseStatus(HttpStatus.OK)
public UserModelDto saveUser(@Valid @RequestBody UserModelCreateDto userModelCreateDto, BindingResult result) {
if (result.hasErrors()) {
throw new ValidationException(getValidationErrorsAsString(result));
} else {
UserModelDto user = userService.save(userModelCreateDto);
LOG.info("User #" + user.getId() + " has been create account");
return user;
}
}
豆
@Bean
public Validator validator (final AutowireCapableBeanFactory autowireCapableBeanFactory) {
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
return validatorFactory.usingContext().getValidator();
}
您需要禁用
Hibernate.