5

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

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

我在本地下载了这个文件,并且能够将它转换为一个对象并写入它,但我不知道如何在不下载本地文件的情况下做同样的事情。这可以在本地工作,但是如何将 URL 指定为要读取的 xml 文件的资源?谢谢 :)

启动上下文.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>
4

1 回答 1

3

StaxEventItemReader需要Resource一个. 查看文档,您会发现可以轻松使用不在文件系统上的资源。任何可以获得 InputStream 的东西都可以转换为 Resource。据我记得,默认使用UrlResource带有回退的。ClasspathResource

4.3.1。网址资源

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

所以你可能只使用这个:

<property name="resource" value="http://www.w3schools.com/xml/plant_catalog.xml" />
于 2013-10-07T21:08:40.210 回答