【问题标题】:Read flat file and write to multiple writers which will write different objects读取平面文件并写入将写入不同对象的多个写入器
【发布时间】:2018-03-12 14:39:36
【问题描述】:

我需要读取一个平面文件并创建一个 TRADE java 对象。现在处理器应该基于 TRADE java 对象创建 3 个不同的 java 对象。 我必须将这 3 个不同的 java 对象写入 3 个不同的 xml 文件。

我只想根据读取的数据读取 3 个处理器和 3 个写入多个 xml 文件。

我尝试过compositeItemWriter,但它会使用相同的对象进行写入。但我有3个不同的对象消费者、信封、deliveryOrder

样本输入:

11000000001F11000000062237      693553467588549
11000000001221000000030237      628525475867698
11000000031110000000562374      687598787668557
11000000001G21000000056237      687557575645346
11000000001F11000000062237      693553467588549
11000000001221000000030237      628525475867698

output 1.
    <consumers>
 <consumer>
            <sequenceNum>1481</sequenceNum>
            <sourceSystemBrandId>237</sourceSystemBrandId>
            <sourceCid>999000367588</sourceCid>
            <preferences>
                <preference>
                    <contentType>Statement</contentType>
                    <value>E</value>
                    <distributionChannel>test@gmail.com</distributionChannel>
                </preference>
            </preferences>
            <deliveryPoints>
                <dpvDeliveryPoint>
                    <dpv>1171783651</dpv>
                </dpvDeliveryPoint>
                <emailDeliveryPoint>
                    <email>test@gmail.com</email>
                </emailDeliveryPoint>
            </deliveryPoints>
  </consumer>
 </consumers>
output 2:
<envelopes>
<envelope>
    <sourceEnvId>xxxx</sourceEnvId>
    <sourceSystemBrandId>xxx</sourceSystemBrandId>
    <sourceCid>xxx</sourceCid>
    <envelopeData>
    <envelopeName>xxx</envelopeName>
    <contentType>statement</contentType>
    <statementData>
    <accountNumber>xxx</accountNumber>
    <accountName>xxx</accountName>
    <statementAmount/>
    <periodStartDate/>
    <periodEndDate/>
    <date>2017-09-04</date>
    </statementData>
<details><detail><name>Class_Email</name><value>xxx</value><type>xxx</type>
</detail></details>
    <envelopeDocuments>
    <envelopeDocument><docRef>Benhe</docRef></envelopeDocument>
    </envelopeDocuments>
    <printSuppressed>YES</printSuppressed>
    <historicalMail>NO</historicalMail>
    <asOfDate>2017-09-04</asOfDate>
    </envelopeData>

</envelope>
</envelopes>


output 3:

<deliveryOrder>
<consumer>
    <preferences>
        <!--1 or more repetitions:-->
        <preference>
            <contentType>string</contentType>
            <value>string</value>
            <!--Optional:-->
            <effectiveDate>2006-08-19T19:27:14+02:00</effectiveDate>
        </preference>
    </preferences>
    <!--Optional:-->
    <details>
        <detail>
            <name>string</name>
            <value>string</value>
        </detail>
        <detail>
            <name>string</name>
            <value>string</value>
        </detail>
        <detail>
            <name>string</name>
            <value>string</value>
        </detail>
    </details>
    <deliveryPoints>
        <unstructuredNameDeliveryPoint>
            <name>string</name>
        </unstructuredNameDeliveryPoint>
    </deliveryPoints>
</consumer>
<envelopeDocuments>
    <envelopeDocument>
        <docRef>string</docRef>
        <docFingerprint>string</docFingerprint>
    </envelopeDocument>
</envelopeDocuments>
<printSuppressed>NO</printSuppressed>
<historicalMail>Yes</historicalMail>
<asOfDate>2005-09-12+02:00</asOfDate>
</envelopeData>undefined</deliveryOrder>

感谢您对此的任何帮助。 谢谢。

【问题讨论】:

    标签: xml spring spring-boot spring-batch


    【解决方案1】:

    您与CompositeItemWriter 关系密切。但是,根据您所描述的内容,有一个更好的选择,即ClassifierCompositeItemWriter。这个ItemWriter 实现允许您注入一个Classifier,您可以实现它来选择您的对象最终开始传递给哪个ItemWriter。事实上,我们甚至提供了一个对您有用的Classifier 实现,SubclassClassifier。这需要一个类的映射作为键,ItemWriter 是值。这将允许您将每个对象类型映射到适当的ItemWriter

    【讨论】:

    • 谢谢迈克尔,我会检查并告诉你。你有同样的样品吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    相关资源
    最近更新 更多