У меня есть эта задача для обработки входных файлов .csv, .txt и хранения данных в базе данных. Для этой цели я использую Spring Batch. Перед тем, как сбрасывать данные в базу данных, я должен выполнить некоторые проверки проверки данных. Я использую Spring Batch's ValidatingItemProcessor
и Hibernate's JSR-303
эталонный вариант реализации hibernate для того же самого. Код выглядит примерно так:Получить объект, который не прошел проверку Проверка весной партии
public class Person{
@Pattern(regexp = "someregex")
String name;
@NotNull
String address;
@NotNull
String age;
//getters and setters
}
И тогда я написал валидатор, который выглядит примерно так -
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import org.springframework.batch.item.validator.ValidationException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.batch.item.validator.Validator;
class MyBeanValidator implements Validator<Person>, InitializingBean{
private javax.validation.Validator validator;
@Override
public void afterPropertiesSet() throws Exception {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.usingContext().getValidator();
}
@Override
public void validate(Person person) throws ValidationException {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(person);
if(constraintViolations.size() > 0) {
generateValidationException(constraintViolations);
}
}
private void generateValidationException(Set<ConstraintViolation<Object>> constraintViolations) {
StringBuilder message = new StringBuilder();
for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
message.append(constraintViolation.getMessage() + "\n");
}
throw new ValidationException(message.toString());
}
И тогда у меня есть процессор, который подкласс Spring Batch-х ValidatingItemProcessor
.
public class ValidatingPersonItemProcessor extends ValidatingItemProcessor<Person>{
@Override
public Person process(Person person) {
//some code
}
Записи, которые проходят проверку достоверности будет передан на другой процессор для дальнейшей обработки, но не смогли из них будут очищены, а затем перешел к следующему процессору.
Теперь я хочу поймать записи, которые не прошли проверку. Моя цель - сообщить обо всех входных записях, которые не прошли проверку и очистить эти записи, прежде чем я смогу передать эти записи следующему процессору для дальнейшей обработки. Как я могу это достичь?
Будет ли процесс весенней партии прекращаться, если проверка не выполняется для некоторого ввода? Если да, как этого избежать? Моя конфигурация процессора выглядит примерно так:
<batch:chunk reader="personItemReader" writer="personDBWriter" processor="personProcessor" commit-interval="100" skip-limit="100"> <batch:skippable-exception-classes> <batch:include class="org.springframework.batch.item.validator.ValidationException"/> </batch:skippable-exception-classes> <batch:listeners> <batch:listener> <bean class="org.someorg.poc.batch.listener.PersonSkipListener" /> </batch:listener> </batch:listeners> </batch:chunk> <bean id="personProcessor" class="org.springframework.batch.item.support.CompositeItemProcessor"> <property name="delegates"> <list> <ref bean="validatingPersonItemProcessor" /> <ref bean="personVerifierProcessor" /> </list> </property> </bean> <bean id="validatingPersonItemProcessor" class="org.someorg.poc.batch.processor.ValidatingPersonItemProcessor" scope="step"> <property name="validator" ref="myBeanValidator" /> </bean> <bean id="myBeanValidator" class="org.someorg.poc.batch.validator.MyBeanValidator"> </bean> <bean id="personVerifierProcessor" class="org.someorg.poc.batch.processor.PersonVerifierProcessor" scope="step"/> </beans>
Возможный дубликат [как создать отчет по отфильтрованным элементам в весенней партии?] (Http://stackoverflow.com/questions/12999435/how-to-create-a-report-on-filtered-items- in-spring-batch) –
Также проверьте http://stackoverflow.com/questions/27318466/spring-batch-how-to-filter-duplicated-items-before-send-it-to-itemwriter –
@LucaBassoRicci Спасибо за комментарий. Как фильтровать исключение как SkipException в ItemProcessor? Также, как вы можете видеть, я генерирую исключение из своего валидатора, а не процессора. Должен ли я изменить это поведение? – raghav