spring-batch - Spring Batch中如何基于configruaiton动态形成XML
问题描述
我必须从数据库表中读取数据并将其转换为 XML 文件。
此外,需要转换为 XML 的字段(表的列)应该是配置驱动的(属性文件或配置表)。
我已经使用 Spring Batach(Spring Boot App) 完成了第一部分。请提供指导以完成第二部分。
<code>
@Bean("dbToXmlJob")
public Job dbToXmlJob(@Qualifier("dbToXmlStep") Step step) throws Exception {
return this.jobBuilderFactory
.get(Constants.JOB_NAME_DB_TO_XML)
//.validator(dbToXmlJobValidator())
.start(step)
.build();
}
@Bean("dbToXmlStep")
public Step dbToXmlStep(@Qualifier("jpaReader") ItemReader<PatientEntity> itemReader,
@Qualifier("dbToXmlProcessor")Function<PatientEntity, PatientRecord> processor,
@Qualifier("xmlWriter")ItemWriter<PatientRecord> writer) throws Exception {
return this.stepBuilderFactory
.get(Constants.STEP_NAME_DB_TO_XML)
.<PatientEntity, PatientRecord>chunk(2)
.reader(itemReader)
.processor(processor)
.writer(writer)
.build();
}
@Bean("jpaReader")
@StepScope
public JpaPagingItemReader<PatientEntity> dbReader() throws Exception {
String jpqlQuery = "SELECT p from PatientEntity p";
JpaPagingItemReader<PatientEntity> reader = new JpaPagingItemReader<>();
reader.setQueryString(jpqlQuery);
reader.setEntityManagerFactory(batchEntityManagerFactory);
reader.setPageSize(100);
reader.afterPropertiesSet();
reader.setSaveState(true);
return reader;
}
@Bean("dbToXmlProcessor")
@StepScope
public Function<PatientEntity, PatientRecord> xmlProcessor() {
return (patientRecord) -> {
return new PatientRecord(
patientRecord.getSourceId(),
patientRecord.getFirstName(),
patientRecord.getMiddleInitial(),
patientRecord.getLastName(),
patientRecord.getEmailAddress(),
patientRecord.getPhoneNumber(),
patientRecord.getStreet(),
patientRecord.getCity(),
patientRecord.getState(),
patientRecord.getZipCode(),
patientRecord.getBirthDate().toString(),
patientRecord.getSocialSecurityNumber());
};
}
@Bean("xmlWriter")
@StepScope
public StaxEventItemWriter<PatientRecord> xmlWriter() {
StaxEventItemWriter<PatientRecord> xmlFileWriter = new StaxEventItemWriter<>();
String exportFilePath = "file:xml/patients.xml";
Path file = Paths.get(applicationProperties.getBatch().getInputPath() +
File.separator + "output.xml");
xmlFileWriter.setResource(new FileSystemResource(file));
xmlFileWriter.setRootTagName("employees");
Jaxb2Marshaller empMarshaller = new Jaxb2Marshaller();
empMarshaller.setClassesToBeBound(PatientRecord.class);
xmlFileWriter.setMarshaller(empMarshaller);
System.out.println("marshalling");;
return xmlFileWriter;
}
</code>
谢谢, 巴拉尚达尔
解决方案
请提供指导以完成第二部分。
- 此外,需要转换为 XML 的字段(表的列)应该是配置驱动的(属性文件或配置表)。
您可以将所需的列放在属性文件中,例如application.properties
:
columns=column1,column5,column42
并使用它们配置您的阅读器:
@Configuration
@EnableBatchProcessing
@PropertySource("classpath:application.properties")
class MyConfigClass {
@StepScope
public JpaPagingItemReader<PatientEntity> dbReader(@Value("${columns}") String columns) throws Exception {
String[] columnsArray = columns.split(",");
// use columns to dynamically create your query
}
// the rest of your config
}
推荐阅读
- python - 你如何使用python查询postgres数据库
- reactjs - 如何在 ReactJS 中使用 react-simple-chatbot 制作聊天机器人组件
- python - 如何从网站中提取硒数据?
- ruby-on-rails - kjvarga 的 Rails sitemap_generator 无法运行,因为旧版 ACL 尝试设置已经具有统一存储桶级别访问权限的访问权限
- java - 如何在 SQL Java 中将列表值作为参数传递
- google-sheets - 谷歌表格 API。附加方法问题。C#
- reactjs - 哪个更好,Workbox 还是 ServiceWorker?
- raku - 合并哈希(Raku)
- mysql - Select Max DATE Record Without using a correlated subquery
- sql - SQL SELECT 变量中的不同