我在使用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);
}
}
我检查了源代码,并按以下顺序调用了侦听器:
实际上,使用BeforeCreateHandler是在运行Validator之前修复/更改实体内容的唯一方法。我100%愿意接受投入。
答案 0 :(得分:2)
你可以这样做:
@HandleBeforeCreate
public void beforeCreate(@Validated Transaction transaction) {
adjustTransactionAmount(transaction);
}
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); } }