Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Marshaller必须支持spring批处理拆分作业中的封送对象错误类_Java_Spring_Spring Batch - Fatal编程技术网

Java Marshaller必须支持spring批处理拆分作业中的封送对象错误类

Java Marshaller必须支持spring批处理拆分作业中的封送对象错误类,java,spring,spring-batch,Java,Spring,Spring Batch,在我用来学习的spring批处理应用程序中,该应用程序将从数据库表中读取数据并保存在xml文件中。我尝试拆分步骤,以便两个步骤并行运行(flow)。(如果需要更多详细信息,我将只放相关代码,我将添加它们)。当我运行作业时,它会读取每个步骤1和步骤2的前10条记录,但每次读取10条记录后,我都会得到一个错误:java.lang.IllegalStateException:Marshaller必须支持封送对象的类 jobPerson.xml: <?xml version="1.0" encod

在我用来学习的spring批处理应用程序中,该应用程序将从数据库表中读取数据并保存在xml文件中。我尝试拆分步骤,以便两个步骤并行运行(flow)。(如果需要更多详细信息,我将只放相关代码,我将添加它们)。当我运行作业时,它会读取每个步骤1和步骤2的前10条记录,但每次读取10条记录后,我都会得到一个错误:java.lang.IllegalStateException:Marshaller必须支持封送对象的类

jobPerson.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc">

.
.


    <bean id="processWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
           <property name="resource" value="file:xml/process.xml"/>
           <property name="marshaller"  ref="processMarshaller"/>
           <property name="rootTagName" value="process"/>
        </bean>



        <bean id="processPersonWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
           <property name="resource" value="file:xml/processPerson.xml"/>
           <property name="marshaller"  ref="processPersonMarshaller"/>
           <property name="rootTagName" value="processPerson"/>
        </bean>

        <bean id="personMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
           <property name="classesToBeBound">
              <value>sb.dbToxml.Person </value>
           </property>
        </bean>
        <bean id="processMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
          <property name="classesToBeBound">
            <value>sb.dbToxml.Process</value>
          </property>
        </bean>
        <bean id="processPersonMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" >
           <property name="classesToBeBound">
             <value>sb.marshaller.ProcessPerson</value>
           </property>
        </bean>
    <bean id="processReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
            <property name="dataSource" ref="dataSource"/>
            <property name="sql" value="SELECT CRA_PROCESS_ID,FEED_PROCESS_TYPE_CD from CRA_PROCESS  "></property>
            <property name="rowMapper">
              <bean class="sb.mappers.ProcessMapper">

              </bean>
            </property>
        </bean>

        <bean id="processPersonReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
          <property name="dataSource" ref="dataSource"></property>
          <property name="sql" value="SELECT cra_process_person_id, sin FROM Cra_Process_Person WHERE cra_process_id &lt; 400"></property>
          <property name="rowMapper">
            <bean  class="sb.mappers.ProcessPersonMapper"></bean>
          </property>
        </bean>


        <!--  ce qui suit pour un job avec  chunk -->
         <batch:job id="personJob">
        <batch:split id="split1" next="step11">
            <batch:flow>
                <batch:step id="step1A1">
                    <batch:tasklet
                        transaction-manager="transactionManager">
                        <batch:chunk reader="processReader"
                            writer="processWriter" commit-interval="10"></batch:chunk>
                    </batch:tasklet>
                </batch:step>
            </batch:flow>
            <batch:flow>
                <batch:step id="step1B1">
                    <batch:tasklet
                        transaction-manager="transactionManager">
                        <batch:chunk reader="processPersonReader"
                            writer="processPersonWriter" commit-interval="10"></batch:chunk>
                    </batch:tasklet>
                </batch:step>
            </batch:flow>
        </batch:split>

        <batch:step id="step11">
            <batch:tasklet transaction-manager="transactionManager">
                <batch:chunk reader="itemReader" writer="itemWriter"
                    commit-interval="30">
                    <batch:listeners>
                        <batch:listener ref="chunkPersonListener" />
                    </batch:listeners>
                </batch:chunk>
            </batch:tasklet>
            <batch:listeners>
                <batch:listener ref="personReadListener" />
            </batch:listeners>
        </batch:step>
        <batch:listeners>
            <batch:listener ref="jobPersonListener" />
        </batch:listeners>
    </batch:job>

</beans>
ProcessPerson.java:

package sb.marshaller;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="processPerson")
public class ProcessPerson
{
  long cra_process_id ;
  String Sin;
  @XmlElement(name="craProcessId")
  public long getCra_process_id()
  {
    return cra_process_id;
  }
  public void setCra_process_id(long cra_process_id)
  {
    this.cra_process_id = cra_process_id;
  }
  @XmlElement(name="sin")
  public String getSin()
  {
    return Sin;
  }
  public void setSin(String sin)
  {
    Sin = sin;
  }


}

processReader
配置了行映射器
sb.mappers.ProcessMapper
。此映射程序返回
CraProcess
类型的项。但是,
processWriter
配置了
processMarshaller
,它需要类型为
sb.dbToxml.Process
的项。因此,读取器和wirter之间存在类型不匹配。因此,要么:

  • 您的
    ProcessMapper
    应该返回
    Process
    (而不是
    CraProcess
  • 或者您的
    processMarshaller
    应该预期
    CraProcess
    类型的项目(而不是
    Process
processPersonReader
processPersonWriter
也存在同样的问题

package sb.mappers;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import ca.gc.cfp.model.entity.process.CraProcessPerson;

public class ProcessPersonMapper implements RowMapper<CraProcessPerson>
{

  @Override
  public CraProcessPerson mapRow(ResultSet rs, int arg1) throws SQLException
  {
    CraProcessPerson craProcessPerson=new CraProcessPerson();
    craProcessPerson.setCraProcessPersonId(rs.getLong("cra_process_person_id"));
    craProcessPerson.setSin(rs.getString("sin"));
    System.out.println("process Person  Mapper id : "+craProcessPerson.getCraProcessPersonId()+" Sin   :"+craProcessPerson.getSin());

    return craProcessPerson;
  }

}
package sb.dbToxml;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="process")
public class Process
{

  long cra_process_id;
  int feed_process_id;

  @XmlElement(name="processId")
  public long getCra_process_id()
  {
    return cra_process_id;
  }
  public void setCra_process_id(long cra_process_id)
  {
    this.cra_process_id = cra_process_id;
  }
  @XmlElement(name="feedProcess")
  public int getFeed_process_id()
  {
    return feed_process_id;
  }
  public void setFeed_process_id(int feed_process_id)
  {
    this.feed_process_id = feed_process_id;
  }

}
package sb.marshaller;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="processPerson")
public class ProcessPerson
{
  long cra_process_id ;
  String Sin;
  @XmlElement(name="craProcessId")
  public long getCra_process_id()
  {
    return cra_process_id;
  }
  public void setCra_process_id(long cra_process_id)
  {
    this.cra_process_id = cra_process_id;
  }
  @XmlElement(name="sin")
  public String getSin()
  {
    return Sin;
  }
  public void setSin(String sin)
  {
    Sin = sin;
  }


}