Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring批处理:创建一个ItemReader,从web服务读取xml文件_Java_Spring_Spring Batch - Fatal编程技术网

Java Spring批处理:创建一个ItemReader,从web服务读取xml文件

Java Spring批处理:创建一个ItemReader,从web服务读取xml文件,java,spring,spring-batch,Java,Spring,Spring Batch,我正在尝试创建一个Spring批处理作业,该作业将处理一个xml文件,该文件将通过REST调用提供 我正在尝试使用一个托管在internet上的XML文件来测试这一点。该文件位于: 我在本地下载了这个文件,并且能够将它转换为一个对象并编写它,但是我不知道如果不在本地下载文件,我如何才能做到同样的事情。这在本地起作用,但如何指定URL作为xml文件的读取资源?谢谢:) launch-context.xml <batch:job id="job1"> <batch:

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

我正在尝试使用一个托管在internet上的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>

statxeventitemreader使用
资源
。 看一下,您将看到您可以轻松地使用文件系统之外的资源。任何可以获取InputStream的内容都可能被转换为资源。 据我记忆所及,默认使用
UrlResource
并返回到
ClasspathResource

4.3.1。URL资源

UrlResource包装了一个java.net.URL,可用于访问通常可通过URL访问的任何对象,如文件、文件和 HTTP目标、FTP目标等。所有URL都有一个标准化字符串 表示,以便使用适当的标准化前缀 指示一种URL类型与另一种URL类型。这包括文件:for 访问文件系统路径http:用于通过http访问资源 协议,ftp:用于通过ftp等访问资源。 UrlResource是由Java代码使用UrlResource构造函数显式创建的,但通常在 调用一个API方法,该方法使用一个字符串参数 表示一条路径。对于后一种情况,JavaBeans属性编辑器将 最终决定创建哪种类型的资源。如果路径字符串 包含一些众所周知的前缀,例如 类路径:,它将为 那个前缀。但是,如果它不识别前缀,它将 假设这只是一个标准URL字符串,并将创建一个 URL资源

所以你可以用这个:

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


我想我少了一些小东西。当我尝试使用您指定的URL时,我得到:
org.springframework.batch.item.ItemStreamException:未能初始化读卡器…原因:java.lang.IllegalStateException:输入资源必须存在(读卡器处于“严格”模式)
我是否需要在tasklet中指定文件流?您是否偶然使用了代理?是的!我不认为这有什么关系,因为我可以从我的浏览器访问xml,但我尝试从另一个网络,它工作了!谢谢!:)我也有类似的问题,你们能帮忙吗?而@user1191081第二个链接似乎不起作用,我首先回答