如何注册自定义约束验证器

时间:2019-07-29 11:05:29

标签: java bean-validation hibernate-validator micronaut

我的电子邮件字符串字段用javax.validation.constraints.Email注释:

import javax.validation.constraints.Email;

public class MyModel {

  @Email
  private String email;
}

当前,当调用相应的api端点时,hibernate-validator的org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator自动对其进行验证:

@Controller("/v1")
@Validated
public class MyController {
  ...

  @Put(uri = "/{id}")
  @Produces("application/json")
  public IdType updateEntity(@Valid MyModel model) {
    return delegate.updateEntity(model);
  }
}

我如何注册我的自定义类以使用Micronaut的验证程序验证电子邮件字段,同时仍使用原始的javax.validation.constraints.Email注释?

这是我的自定义约束验证器的外观:

import javax.inject.Singleton;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.Email;

@Singleton
public class EmailValidator implements ConstraintValidator<Email, String> {

  @Override
  public void initialize(Email constraintAnnotation) {}

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    if (value == null) {
      return true;
    }
    return value.contains("@");
  }
}

Micronaut版本:1.1.4

2 个答案:

答案 0 :(得分:0)

将验证器从@Email更改为@MailAdress或任何非标准注释。 每个人都希望@Email是从Javax / Hibernate导入的。

如果您要添加行为,还可以检查@Pattern(因为@Email批注中未选中点)

答案 1 :(得分:0)

您似乎正在寻找的是这个

HibernateValidatorConfiguration configuration = Validation
    .byProvider( HibernateValidator.class )
    .configure();

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
        .constraintDefinition( Email.class )
        .includeExistingValidators( false )
        .validatedBy( MyEmailValidator.class );

configuration.addMapping( constraintMapping );

这是一种针对现有约束条件“替换”现有验证器的编程方式。有关此详细信息,请检查doc

的这一部分
相关问题