首页 > 解决方案 > 如何在 spring batch-xstream 中读取自定义 xml 标签阅读器

问题描述

我是春季批次的新手。我必须使用 spring 批处理将 XML 解析到数据库,如果定义的 dto 具有与 XML 标记相同的值,则它可以正常工作。但是,如果我有一个未在 dto 中定义的附加标签(我应该跳过它),它就不起作用。

xml文件不工作

工作xml文件

批处理配置.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;
     }
    }

标签: xmlspringspring-batchxmlreaderxstream

解决方案


推荐阅读