Как зарегистрировать пользовательский валидатор ограничений

Поле строки моего адреса электронной почты помечено javax.validation.constraints.Email:

import javax.validation.constraints.Email;

public class MyModel {

  @Email
  private String email;
}

В настоящее время org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator hibernate-validator автоматически проверяет его, когда вызывается соответствующая конечная точка api:

@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("@");
  }
}

Версия Микронавта: 1.1.4


person emazzotta    schedule 29.07.2019    source источник


Ответы (2)


Похоже, что вы ищете вот что:

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

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

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

configuration.addMapping( constraintMapping );

Это программный способ «замены» существующего валидатора для существующего ограничения. Дополнительные сведения об этом см. В этой части документ

person mark_o    schedule 29.07.2019

Измените свой валидатор с @Email на @MailAdress или любую нестандартную аннотацию. Все ожидают, что @Email будет импортирован из Javax / Hibernate.

Если вы хотите добавить поведение, вы также можете проверить @Pattern (поскольку точка не отмечена в аннотации @Email)

person IQbrod    schedule 29.07.2019
comment
Спасибо, хотя это не то, что я ищу. Обратите внимание, что в вопросе, который я сформулировал, все еще используя исходную аннотацию javax.validation.constraints.Email. - person emazzotta; 29.07.2019
comment
Изменение имени аннотации предоставит вам доступ как к @Email, так и к вашей пользовательской аннотации @Email @CustomAnnotation public String myField; (и никого не смутят ваши стандартные аннотации) - person IQbrod; 29.07.2019
comment
Весь класс MyModel - это автоматически сгенерированный код, который должен оставаться неизменным. - person emazzotta; 29.07.2019