Используйте ConstraintValidator для проверки объекта - PullRequest
0 голосов
/ 05 июня 2018

Я хочу пройти мимо моих собратьев по Java.Посмотрите, кажется ли вам это достаточно вменяемым.Возможно, есть лучший способ сделать это, но я подумал: могу ли я написать ConstraintValidator двойного назначения, который может проверять поле (объект некоторого вида), когда оно передается в метод, а также может использоваться для проверки экземпляраэтот объект вне этого контекста, все еще используя аннотации?Я придумал следующий подход.Дайте мне знать, что вы об этом думаете.Вариант использования:

...
@POST
public Response retrieveSomething(@Encoded @IsAParamValid MyParamObject myParamObject)
{
  ...
}

Я также хочу иметь возможность сделать это где-нибудь еще в коде:

IsAParamValidValidator.validate(myParamObject);

без дублирования логики для проверки.Очень важно, чтобы я хотел, чтобы служба автоматической генерации исключений использовала @IsAParamValid в вызове метода.

1 Ответ

0 голосов
/ 05 июня 2018

Моя идея о том, как получить лучшее из обоих миров:

Мой класс аннотаций:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {IsAParamValidValidator.class})
@Documented
public @interface IsAParamValid
{
 String message() default "The param was invalid";
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
}

Мой класс валидаторов:

public class IsAParamValidValidator implements ConstraintValidator<IsAParamValid, MyParamObject>
{
  public static void validate(@IsAParamValid MyParamObject myParamObject) {
  }

  @Override
  public void initialize(IsAParamValid isAParamValid) {
  }

  @Override
  public boolean isValid(MyParamObject myParamObject, ConstraintValidatorContext constraintValidatorContext)
  {
    // do the check
    boolean bResult = ... whatever ...
    return bResult;
  }

}

ОК, такчто вы все думаете?

...