Передать параметр из валидатора в пользовательский валидатор в валидаторе гибернации - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь проверить бин с помощью пользовательского валидатора.Но валидатору нужна информация, которая должна быть передана ему из метода, где вызывается валидация.Есть ли способ сделать это?

Я не могу передать его в инициализации, так как он недоступен во время создания компонента.

Компонент для проверки

class vehicle {
   @VehicleNameValidator
   String vehicleName;
}

Аннотация

@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = VehicleNameValidatorImpl.class)
@Documented
public @interface VehicleNameValidator {
    String message() default "Invalid vehicle Name";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

пользовательский валидатор

public class VehicleNameValidatorImpl implements ConstraintValidator<VehicleNameValidator, String[]> {

    @Override
    public boolean isValid(String vehicleName, ConstraintValidatorContext constraintValidatorContext) {
        boolean isValid = logicmethod()//some logic here
        return isValid;
    }
}

Основной метод

public static void main(String[] args) {
   String whatIwantToPass = runtimelogic(args);
   vehicle veh1 = new vehicle();
   Set<ConstraintViolation<vehicle>> constraintViolations = 
   validator.validate(veh1);
}

Как передать переменную "whatIwantToPass" из основного метода в VehicleNameValidatorImpl.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Если вы используете Hibernate Validator, возможно, вы захотите взглянуть на полезную нагрузку средства проверки ограничений.В вашем случае это выглядело бы примерно так:

В вашем Impal для валидатора вы можете получить доступ к полезной нагрузке:

public boolean isValid(String vehicleName, ConstraintValidatorContext constraintValidatorContext) {
    boolean isValid = false;
    if ( constraintValidatorContext instanceof HibernateConstraintValidatorContext ) {
        final String payload = constraintValidatorContext
                .unwrap( HibernateConstraintValidatorContext.class )
                .getConstraintValidatorPayload( String.class );
        // do whatever you need
        isValid = logicmethod()//some logic here
    }
    return isValid;
}

И полезная нагрузка может быть установлена ​​либо на уровне фабрики валидатора, либо для каждого валидаторакак это:

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure()
        .buildValidatorFactory();

String whatIwantToPass = runtimelogic( args );

Validator validator = validatorFactory.unwrap( HibernateValidatorFactory.class )
        .usingContext()
        .constraintValidatorPayload( whatIwantToPass )
        .getValidator();

// use the validator with the constraint validator payload 
vehicle veh1 = new vehicle();
Set<ConstraintViolation<vehicle>> constraintViolations = validator.validate( veh1 );

Для более подробной информации проверьте эту часть документации - Передача полезной нагрузки в валидатор ограничения

0 голосов
/ 26 июня 2019

Вы всегда можете использовать аннотации @Autowired или @Value при реализации ConstraintValidator. Я считаю, что вы можете сделать что-то подобное в вашем VehicleNameValidatorImpl.class

    public class VehicleNameValidatorImpl implements ConstraintValidator<VehicleNameValidator, String[]> {

        @Autowired
        LogicWrittenClass logicWrittenClass;

        @Override
        public boolean isValid(String[] roles, ConstraintValidatorContext constraintValidatorContext) {
            String whatIwantToPass  = logicWrittenClass.runtimelogic();
            boolean isValid = logicmethod()//some logic here
            return isValid;
        }
    }

Но убедитесь, что вы используете пружинучтобы создать bean-компонент validator, иначе внедрение bean-компонента не будет работать, поскольку создание bean-компонента validator вручную с использованием фабрики valdiation (Hibernate Validator в качестве эталонного внедрения) не внедряет зависимости в экземпляры ConstraintValidator.

...