Spring Batch:创建从Web服务读取XML文件的ItemReader

2022-02-28 00:00:00 spring java spring-batch

我正在尝试创建一个Spring批处理作业,该作业将处理将通过睡觉调用提供的xml文件。

我正在尝试使用Internet上托管的XML文件来测试这一点。该文件位于:http://www.w3schools.com/xml/plant_catalog.xml

我在本地下载了此文件,并能够将其转换为对象并写入,但如果不将文件下载到本地,我不知道如何才能做到这一点。这在本地有效,但是如何将URL指定为XML文件要读取的资源呢?谢谢:)

Launch-context.xml

    <batch:job id="job1">
    <batch:step id="step1">
        <batch:tasklet transaction-manager="transactionManager" start-limit="100" >
            <batch:chunk reader="CustomPlantReader" writer="writer" commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>

自定义读卡器bean:

    <bean id="CustomPlantReader" class="org.springframework.batch.item.xml.StaxEventItemReader" scope="step">
    <property name="fragmentRootElementName" value="PLANT" />
    <property name="resource" value="file:/C:/source/plant_catalog.xml" />
    <property name="unmarshaller" ref="PlantUnmarshaller" />
</bean>

<bean id="PlantUnmarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <property name="ignoreExtraElements" value="true" />
    <property name="mappingLocation" value="linemapper/mapping.xml" />
</bean>

作为参考,如果任何人想要查看mapping.xml文件,其外观如下所示。它将XML节点映射到名为Plant.java的域对象

<mapping>
<class name="com.example.project.Plant">
    <map-to xml="PLANT" />

    <field name="common" type="string">
        <bind-xml name="COMMON" node="element"/>
    </field>
    <field name="botanical" type="string">
        <bind-xml name="BOTANICAL" node="element"/>
    </field>
    <field name="zone" type="string">
        <bind-xml name="ZONE" node="element"/>
    </field>
    <field name="light" type="string">
        <bind-xml name="LIGHT" node="element"/>
    </field>
    <field name="price" type="string">
        <bind-xml name="PRICE" node="element"/>
    </field>
    <field name="availability" type="string">
        <bind-xml name="AVAILABILITY" node="element"/>
    </field>

</class></mapping>

解决方案

StaxEventItemReader接受Resource。 看一下documentation,您会发现您可以很容易地使用不在您的文件系统上的资源。任何可以获取InputStream的内容都可能转换为资源。 据我所知,默认使用UrlResource,后备为ClasspathResource

4.3.1。URL资源

UrlResource包装了java.net.URL,并可用于访问任何通常可通过URL访问的对象,如文件、 HTTP目标、FTP目标等。所有URL都具有标准化字符串 表示,以便使用适当的标准化前缀 若要指示不同的URL类型,请执行以下操作。这包括FILE:FOR 访问文件系统路径,http:用于通过HTTP访问资源 协议、ftp:用于通过FTP等访问资源。 UrlResource由Java代码使用UrlResource构造函数显式创建,但在执行以下操作时通常会隐式创建 调用带有字符串参数的API方法,该参数旨在 表示一条路径。对于后一种情况,JavaBeans PropertyEditor将 最终决定要创建哪种类型的资源。如果路径字符串 包含一些众所周知的(也就是)前缀,如 classpath:,它将为以下对象创建适当的专用资源 那个前缀。但是,如果它不能识别前缀,它将 假设这只是一个标准URL字符串,并将创建一个 UrlResource。

所以您可以使用以下命令:

<property name="resource" value="http://www.w3schools.com/xml/plant_catalog.xml" />

相关文章