当前位置: 首页 > 知识库问答 >
问题:

使用MultiResourceItemReader读取2个纯文本文件并写入单个文件

弘烨烁
2023-03-14

我的批处理作业将生成每行字符串格式的2个文本文件。我创建了一个阅读器

<bean id="myMultiResourceReader"
    class=" org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="file:D:/MY/sample/*.txt" />
</bean> 
<bean id="myFinalWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"
    scope="step">
    <property name="resource" value="${test.file3}" />
    <property name="lineAggregator">
        <bean
            class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
    </property>
    <property name="footerCallback" ref="myFinalCustomItemWriter" />
    <property name="headerCallback" ref="myFinalCustomItemWriter" />
</bean>
<bean id="myFinalCustomItemWriter" class="my.process.MyWriter"
    scope="step">
    <property name="delegate" ref="myFinalWriter" />
    <property name="stepContext" value="#{stepExecution.stepName}" />
</bean>

我得到了这个错误:

Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.sun.proxy.$Proxy68 implementing org.springframework.batch.item.file.ResourceAwareItemWriterItemStream,org.springframework.beans.factory.InitializingBean,org.springframework.batch.item.ItemStreamWriter,org.springframework.batch.item.ItemStream,org.springframework.aop.scope.ScopedObject,java.io.Serializable,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'org.springframework.batch.item.file.FlatFileItemWriter' for property 'delegate'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy68 implementing org.springframework.batch.item.file.ResourceAwareItemWriterItemStream,org.springframework.beans.factory.InitializingBean,org.springframework.batch.item.ItemStreamWriter,org.springframework.batch.item.ItemStream,org.springframework.aop.scope.ScopedObject,java.io.Serializable,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.batch.item.file.FlatFileItemWriter] for property 'delegate': no matching editors or conversion strategy found
public class MyWriter implements ItemWriter<String>, FlatFileFooterCallback, FlatFileHeaderCallback, ItemStream{
private static Logger log = Logger.getLogger(MyWriter.class);
private FlatFileItemWriter<String> delegate;
private int recordCount = 0;
private String stepContext;

public void writeFooter(Writer writer) throws IOException {
    writer.write("#" + recordCount);
}

public void writeHeader(Writer writer) throws IOException {
    writer.write("#" + StringUtil.getSysDate());
}

public void setDelegate(FlatFileItemWriter<String> delegate) {
    this.delegate = delegate;
}

public void write(List<? extends String> list) throws Exception {
     int chunkRecord = 0;
    for (String item : list) {
        chunkRecord++;
    }
    delegate.write(list);
    recordCount += chunkRecord;
}

public void close() throws ItemStreamException {
    this.delegate.close();
}

public void open(ExecutionContext arg0) throws ItemStreamException {
    this.delegate.open(arg0);
}

public void update(ExecutionContext arg0) throws ItemStreamException {
    this.delegate.update(arg0);
}

public void setStepContext(String stepContext) {
    this.stepContext = stepContext;
}

共有1个答案

叶弘深
2023-03-14

正如Luca Basso Ricci已经指出的,问题在于您在MyWriter中的委托定义。由于Spring为它的bean创建代理,它将无法将您的FlatFileItemReader识别为FlatFileItemWriter的实际实例,因此,setDelegate(FlatFileItemWriter委托)将失败。

在MyWriter中使用ItemStreamWriter正如您在异常消息中看到的,创建的代理确实提供了这个接口。因此,可以插入

这将解决委托写、打开、关闭和更新方法。为了编写页眉和页脚,您需要实现HeaderCallback和FooterCallback,并直接在FlatFileItemWriter的定义中设置它。

作为FooterCallback,创建您自己的bean。在FlatFileItemWriter中使用它来编写页脚。向它添加一个“recreeCount”方法,并在MyWriter Bean中使用它来增加写入计数。

public void write(List<? extends String> list) throws Exception {
    myFooterCallback.increaseCount(list.size());
    delegate.write(list);
}
 类似资料:
  • 我正在尝试转换一个大的文本文件(大小为5 gig),但得到了一个从这篇文章中,我设法将文本文件的编码格式转换为可读的格式: 这里的问题是,当我试图转换一个大尺寸(5 GB)的文本文件时。我会得到这个错误 我知道它无法读取这么大的文件。我从几个链接中发现,我可以逐行阅读。 那么,我如何应用于我必须让它逐行读取的代码呢?我对逐行读取的理解是,我需要从中读取一行,并将其添加到中,直到行尾,对吗?

  • 问题内容: 我的服务器中有一个包含此信息的文本文件: 如何使用PHP从文本文件中逐行读取所有信息? 问题答案: 这将使您逐行阅读..阅读php.net/fgets上有关Mac的行尾问题的注释。

  • 我正在创建一个医院管理系统,其中我有2个类,即Add医生和Add病人,从用户那里输入他们的详细信息,并将其存储到各自的文件中。我现在想创建一个约会类,在这个类中,我可以将具有特定ID的患者分配给从文件中读取的具有特定ID的医生。如果Java支持多重继承,这将非常容易,但是因为它不支持,所以我无法完成这项任务。 下面是我的AddDoctor课程 下面是我的AddPatient课程

  • 我有一个巨大的文件(2GB),其中只包含员工编号。我必须阅读此文件,获取员工号码并调用数据库以获取员工的工资,然后将其写入另一个文件中,并将员工姓名和工资作为其行。 现在的问题是,通过直接读取这个巨大的文件通过简单的nio在java我的STS内存溢出或它需要4-5小时来完成整个读-取-写过程。 所以我想用Java并发来拯救我。 为此,我有一个实现Runnable的EmployeeDetails类,

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 我正在创建一个医院管理系统,其中我有两个类,即AddDoctor和AddPatient,这两个类从用户那里获取有关其详细信息的输入,并将其存储到各自的文件中。现在,我想创建一个预约类,在这个类中,我可以将具有特定ID的患者分配给从文件中读取的具有特定ID的医生。如果JAVA支持多重继承,这是非常容易的,但因为它不支持多重继承,我一直在思考如何完成这项任务。请帮帮我。下面是我的AddDoctor课程

  • 档案员。txt包含两类员工的详细信息,即月薪和小时津贴。如果是月薪员工,则该文件包含名字、姓氏、性别、职级、类型和基本工资,如果是小时薪员工,则包含小时工资和工作小时数。该文件的示例如下所示: 约翰·史密斯M经理每月45000.00 Sunil Bates M高级每小时700.00 45 梁爱娃F警官每月30500.00 我要写一个程序,会看每个员工,计算奖金占基本工资的百分比,对于一个按小时计酬

  • 基于这个问题,我试着阅读pdf文件中的每一页。背景是,我试图用完全空白的页面替换不包含任何文本内容但包含图像的页面。其背景是pdf可以包含可能包含图像的空白页面。这些页面确实需要在那里,因为它们即将用双面打印。 但在PDFBox 2.0中,这似乎有点复杂,因为每次我试图保存新生成的时,都会遇到堆栈跟踪。新版本的是否应该与之有所不同?我是否应该避免关闭,因为如果不关闭它,示例程序会毫无例外地运行,这