编组器必须支持与弹簧批处理拆分作业中的编组对象错误的类



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

工作人.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>

进程映射器 :

package sb.mappers;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import ca.gc.cfp.model.entity.process.CraProcess;
public class ProcessMapper implements RowMapper<CraProcess>
{
@Override
public CraProcess mapRow(ResultSet rs, int arg1) throws SQLException
{
CraProcess craProcess =new CraProcess();
craProcess.setCraProcessId(rs.getLong("Cra_Process_Id"));
craProcess.setFeedProcessTypeCd(rs.getShort("feed_Process_Type_Cd"));
System.out.println("process Mapper id : "+craProcess.getCraProcessId()+" feed type cd  :"+craProcess.getFeedProcessTypeCd());
return craProcess;
}
}

ProcessPersonMapper:

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;
}
}

工艺.java :

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;
}
}

进程人员.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配置了需要类型sb.dbToxml.Process的项目的processMarshaller。因此,阅读器和 wirter 之间存在类型不匹配。因此,请执行以下任一操作:

  • 您的ProcessMapper应返回Process(而不是CraProcess(
  • 或者您的processMarshaller应该期待CraProcess型(而不是Process(类型的物品

您在processPersonReaderprocessPersonWriter方面遇到同样的问题。

最新更新