Повторное использование артефактов из проверки - PullRequest
0 голосов
/ 14 февраля 2019

Допустим, я создаю валидатор для NewUserRequestBean с именем @CheckUsernameAvailable.

Валидатор будет выполнять что-то простое, например

public boolean isValid(NewUserRequestBean request, ConstraintValidationContext context) {
    String userName = request.getUserName();
    User existingUser = userProviderService.getUser(userName);
    if (existingUser != null) {
        return false;
    }
}

Есть ли способ повторно использовать existingUserобъект, чтобы сделать что-то вроде

// if (existingUser != null)
else if (existingUser.getEmailAddress() == request.getUserEmailAddress()) {
    sendObjectToCaller(existingUser);
    // or returnObjectToCaller(existingUser);
}

1 Ответ

0 голосов
/ 16 февраля 2019

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

    @Override
    public boolean isValid(NewUserRequestBean value, ConstraintValidatorContext context) {
        // all the code you need

        // make sure that you are working with Hibernate Validator contexts before unwrapping
        if ( context instanceof HibernateConstraintValidatorContext ) {
            context.unwrap( HibernateConstraintValidatorContext.class )
                    .withDynamicPayload( existingUser );
        }

        return validationResult;
    }

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

    Set<ConstraintViolation<NewUserRequestBean>> violations = // results of validation of your NewUserRequestBean... 

    // just get the violation and unwrap it to HibernateConstraintViolation.
    // to stay on the safe side you should apply an instanceof check here as well before unwrapping
    HibernateConstraintViolation<NewUserRequestBean> violation = violations.iterator().next()
            .unwrap( HibernateConstraintViolation.class );

    User existingUser = violation.getDynamicPayload( User.class );

Для получения дополнительной информации выможете проверить javadocs этих динамических методов полезной нагрузки, а также ознакомьтесь с этим разделом в документации по динамическим полезным нагрузкам

...