Весеннее пакетное чтение из XML-записи в CSV-файл - PullRequest
0 голосов
/ 28 мая 2019

Привет, у меня есть весеннее пакетное задание для чтения из файла XML и записи в файл CSV. У меня возникла проблема, связанная с изменением этого рабочего примера, работает с файлом XML с вложенным тегом:

в рабочем примере xml:

<?xml version="1.0" encoding="UTF-8" ?>
<company>
    <record >
        <name>ben</name>
        <age>31</age>
        <dob>31/8/1982</dob>
        <income>200,000</income>
    </record>
    <record >
        <name>aya</name>
        <age>30</age>
        <dob>26/7/1983</dob>
        <income>100,999</income>
    </record>
   </company>

Я хочу, чтобы он работал с XML-файлом следующим образом:

<company>
    <record >
        <name>ben</name>
        <age>31</age>
        <dob>31/8/1982</dob>
        **<income>
           <Gross> 2000<Gross/>
           <Net>1000</Net>
        </income>**
    </record>
    <record >
        <name>aya</name>
        <age>30</age>
        <dob>26/7/1983</dob>
        <income>100,999</income>
    </record>
   </company>

  <batch:job id="reportJob">
    <batch:step id="step1">
    <batch:tasklet>
        <batch:chunk reader="xmlItemReader" 
            writer="cvsFileItemWriter" processor="filterReportProcessor"
            commit-interval="1">
        </batch:chunk>
    </batch:tasklet>
    </batch:step>
  </batch:job>

  <!-- Filtering process -->
  <bean id="filterReportProcessor" class="com.mkyong.processor.FilterReportProcessor" />

  <bean id="xmlItemReader" 
        class="org.springframework.batch.item.xml.StaxEventItemReader">
    <property name="fragmentRootElementName" value="record" />
    <property name="resource" value="classpath:xml/report.xml" />
    <property name="unmarshaller" ref="reportUnmarshaller" />
  </bean>

  <!-- Read and map values to object, via jaxb2 -->
  <bean id="reportUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
    <list>
        <value>com.ben.model.Report</value>
    </list>
    </property>
  </bean>

  <bean id="cvsFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <!-- write to this csv file -->
    <property name="resource" value="file:cvs/report.csv" />
    <property name="shouldDeleteIfExists" value="true" />

    <property name="lineAggregator">
      <bean
        class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
        <property name="delimiter" value="," />
        <property name="fieldExtractor">
          <bean
            class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
            <property name="names" value="refId, name, age, csvDob, income" />
           </bean>
        </property>
       </bean>
    </property>
  </bean>

</beans>

POJO выглядит так:

@XmlRootElement(name = "record")
public class Report {

    private int refId;
    private String name;
    private int age;
    private Date dob;
    private BigDecimal income;

    @XmlAttribute(name = "refId")
    public int getRefId() {
        return refId;
    }

    public void setRefId(int refId) {
        this.refId = refId;
    }

    @XmlElement(name = "age")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlJavaTypeAdapter(JaxbDateAdapter.class)
    @XmlElement
    public Date getDob() {
        return dob;
    }

    @XmlJavaTypeAdapter(JaxbDateAdapter.class)
    public void setDob(Date dob) {
        this.dob = dob;
    }

    @XmlJavaTypeAdapter(JaxbBigDecimalAdapter.class)
    @XmlElement
    public BigDecimal getIncome() {
        return income;
    }

    public void setIncome(BigDecimal income) {
        this.income = income;
    }

    // for csv demo only
    public String getCsvDob() {

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        return dateFormat.format(getDob());

    }

}

До сих пор я пытался создать класс Income в записи и добавлял Gross и Net в XML-файл конфигурации следующим образом: <property name="names" value="refId, name, age, csvDob, Gross,Net" />,, но это не сработало, я не получил значения Gross и Net. что я должен сделать, чтобы это заработало, пожалуйста.

1 Ответ

0 голосов
/ 29 мая 2019

Это скорее вопрос JAXB, чем вопрос Spring Batch.Ваша проблема заключается в том, как сопоставить этот фрагмент XML:

<record >
    <name>ben</name>
    <age>31</age>
    <dob>31/8/1982</dob>
    <income>
       <Gross> 2000<Gross/>
       <Net>1000</Net>
    </income>
</record>

с вашим доменным объектом типа Report.Как определено в вашем примере, отображение не работает, потому что поле income имеет тип BigDecimal.

. До сих пор я пытался создать класс Income

Вам необходимо обновить тип поля income с BigDecimal до Income.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...