xml - 如何在 spring batch-xstream 中读取自定义 xml 标签阅读器
问题描述
我是春季批次的新手。我必须使用 spring 批处理将 XML 解析到数据库,如果定义的 dto 具有与 XML 标记相同的值,则它可以正常工作。但是,如果我有一个未在 dto 中定义的附加标签(我应该跳过它),它就不起作用。
批处理配置.java:
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.ItemPreparedStatementSetter;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.xml.StaxEventItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.oxm.xstream.XStreamMarshaller;
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSource;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost/springbatch");
dataSource.setUsername("root");
dataSource.setPassword("admin");
return dataSource;
}
@Bean
public StaxEventItemReader<User> reader() {
StaxEventItemReader<User> reader = new StaxEventItemReader<User>();
reader.setResource(new ClassPathResource("user.xml"));
reader.setFragmentRootElementName("user");
Map<String, String> aliases = new HashMap<String, String>();
aliases.put("user", "com.example.demo.User");
XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
xStreamMarshaller.setAliases(aliases);
reader.setUnmarshaller(xStreamMarshaller);
return reader;
}
@Bean
public JdbcBatchItemWriter<User> writer() {
JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<User>();
writer.setDataSource(dataSource);
writer.setSql("insert into user(id,name) values(?, ?)");
writer.setItemPreparedStatementSetter(new UserItemPreparedStmSetter());
return writer;
}
private class UserItemPreparedStmSetter implements ItemPreparedStatementSetter<User> {
@Override
public void setValues(User user, PreparedStatement ps) throws SQLException {
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
}
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<User, User>chunk(10).reader(reader()).writer(writer()).build();
}
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).flow(step1()).end().build();
}
}
Dto:
package com.example.demo;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
解决方案
推荐阅读
- neo4j - Neo4j 版本。4.1.1 密码语法错误“使用定期提交”
- mongodb - 有没有办法从 MongoDB 中的 ObjectId 生成条形码或二维码?
- python - Python - 标准库对将 dict 转换为 attributes-dict 的支持
- python - 如何比较Python中的列表列表?
- python - 如何将参数传递给类中的装饰器
- python - AttributeError:“PerReplica”对象没有属性“numpy”
- python - 我的电脑无法在 Python 3.8 上安装 pip
- c - C:在函数中比较两个字符串时出现问题
- html - 使用 instafeed 仅显示最新的 instagram 图片
- python - 在 Chainer 中定义一些可学习的参数