/**
-
ItemReader定义:读取文件数据+entirty实体类映射
-
@return
*/
@Bean
public ItemReader reader(){
// 使用FlatFileItemReader去读cvs文件,一行即一条数据
FlatFileItemReader reader = new FlatFileItemReader<>();
// 设置文件处在路径
reader.setResource(new ClassPathResource(“static/bloginfo.csv”));
// entity与csv数据做映射
reader.setLineMapper(new DefaultLineMapper() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames(new String[]{“blogAuthor”,“blogUrl”,“blogTitle”,“blogItem”});
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper() {
{
setTargetType(BlogInfo.class);
}
});
}
});
return reader;
}
简单代码解析:
对于数据读取器 ItemReader ,我们给它安排了一个读取监听器,创建 MyReadListener.java :
/**
-
@Author : JCccc
-
@CreateTime : 2020/3/17
-
@Description :
**/
public class MyReadListener implements ItemReadListener {
private Logger logger = LoggerFactory.getLogger(MyReadListener.class);
@Override
public void beforeRead() {
}
@Override
public void afterRead(BlogInfo item) {
}
@Override
public void onReadError(Exception ex) {
try {
logger.info(format(“%s%n”, ex.getMessage()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
ItemProcessor
写在MyBatchConfig类里
/**
-
注册ItemProcessor: 处理数据+校验数据
-
@return
*/
@Bean
public ItemProcessor<BlogInfo, BlogInfo> processor(){
MyItemProcessor myItemProcessor = new MyItemProcessor();
// 设置校验器
myItemProcessor.setValidator(myBeanValidator());
return myItemProcessor;
}
数据处理器,是我们自定义的,里面主要是包含我们对数据处理的业务逻辑,并且我们设置了一些数据校验器,我们这里使用
JSR-303的Validator来作为校验器。
校验器
写在MyBatchConfig类里
/**
-
注册校验器
-
@return
*/
@Bean
public MyBeanValidator myBeanValidator(){
return new MyBeanValidator();
}
创建MyItemProcessor.java :
ps: 里面我的数据处理逻辑是,获取出读取数据里面的每条数据的blogItem字段,如果是springboot,那就对title字段值进行替换。
其实也就是模拟一个简单地数据处理场景。
import com.example.batchdemo.pojo.BlogInfo;
import org.springframework.batch.item.validator.ValidatingItemProcessor;
import org.springframework.batch.item.validator.ValidationException;
/**
-
@Author : JCccc
-
@CreateTime : 2020/3/17
-
@Description :
**/
public class MyItemProcessor extends ValidatingItemProcessor {
@Override
public BlogInfo process(BlogInfo item) throws ValidationException {
/**
- 需要执行super.process(item)才会调用自定义校验器
*/
super.process(item);
/**
- 对数据进行简单的处理
*/
if (item.getBlogItem().equals(“springboot”)) {
item.setBlogTitle(“springboot 系列还请看看我Jc”);
} else {
item.setBlogTitle(“未知系列”);
}
return item;
}
}
创建MyBeanValidator.java:
import org.springframework.batch.item.validator.ValidationException;
import org.springframework.batch.item.validator.Validator;
import org.springframework.beans.factory.InitializingBean;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import java.util.Set;
/**
-
@Author : JCccc
-
@CreateTime : 2020/3/2017
-
@Description :
**/
public class MyBeanValidator implements Validator, InitializingBean {
private javax.validation.Validator validator;
@Override
public void validate(T value) throws ValidationException {
/**
- 使用Validator的validate方法校验数据
*/
Set<ConstraintViolation> constraintViolations =
validator.validate(value);
if (constraintViolations.size() > 0) {
StringBuilder message = new StringBuilder();
for (ConstraintViola