从验证中重用工件

问题描述 投票:0回答:1

让我们说我为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);
}
java bean-validation hibernate-validator spring-validator
1个回答
0
投票

如果您使用的是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,另请参阅dynamic payloads文档中的此部分。

© www.soinside.com 2019 - 2024. All rights reserved.