在@HandleBeforeCreate之前运行验证

时间:2017-01-17 12:30:23

标签: spring spring-boot spring-data-rest

我在使用Spring Rest进行验证时遇到了一些问题,@ HandleBeforeCreate事件处理程序在验证之前运行。我希望它能在验证后运行。

在我的测试应用程序中,我有一个交易,它有两个存储交易价值的字段,一个用于实际交易货币,另一个用于转换为用户货币的最终价值。在我创建之前的句柄中我处理了那个转换,但如果金额为空,我希望请求在验证器中停止。

我可以在事件处理程序中验证资源(我已准备好处理RepositoryConstraintViolationException),但它让我想到了使用验证器的问题。它也会在每个数据休息请求上产生一些效率低下的问题,如果它们支持对象类,则会通过所有验证程序检查它们。

对EventHandler的验证是否优于Validator(出于性能原因)?如何强制验证器在EventHandlers之前运行?

*我使用的是spring-boot 1.4.2.RELEASE

  

验证

public class TransactionValidator extends SpringValidator<Transaction> {

    @Override
    public boolean supports(Class<?> clazz) {
        return Transaction.class.equals(clazz) ;
    }

    @Override
    public void validateObject(Transaction transaction, Errors errors) {
        ... validations ...
    }

}


public abstract class SpringValidator<T> implements Validator {

    @Override
    public void validate(Object target, Errors errors) {
        validateObject((T) target, errors);
    }

    protected abstract void validateObject(T target, Errors errors);

}
  

事件处理程序

@Component
@RequiredArgsConstructor
@RepositoryEventHandler(Transaction.class)
public class TransacationEventHandler {

    private final CurrencyUnitService currencyUnitService;

    @HandleBeforeCreate
    public void beforeCreate(Transaction transaction) {
        adjustTransactionAmount(transaction);
    }

    @HandleBeforeSave
    public void beforeSave(Transaction transaction) {
        adjustTransactionAmount(transaction);
    }

}

修改

我检查了源代码,并按以下顺序调用了侦听器:

enter image description here

实际上,使用BeforeCreateHandler是在运行Validator之前修复/更改实体内容的唯一方法。我100%愿意接受投入。

1 个答案:

答案 0 :(得分:2)

1。使用@Validated(未测试)

你可以这样做:

@HandleBeforeCreate
public void beforeCreate(@Validated Transaction transaction) {
    adjustTransactionAmount(transaction);
}

2。否则 - 您可以通过Java配置

定义Validator

您可以按照 @MathiasDpunkt Spring data rest validation + exception mapper: confusing)的回答:

@Configuration
public class MyValidationConfiguration extends RepositoryRestConfigurerAdapter {

    @Bean
    @Primary
    /**
     * Create a validator to use in bean validation - primary to be able to autowire without qualifier
     */
    Validator validator() {
        return new LocalValidatorFactoryBean();
    }

    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener
validatingListener) {
        Validator validator = validator();
        //bean validation always before save and create
        validatingListener.addValidator("beforeCreate", validator);
        validatingListener.addValidator("beforeSave", validator);
    }
}