使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2Marshaller

2023-12-09

我需要使用 Spring Batch 编写稍微复杂的 XML。谁能帮我进行适当的 Spring 配置吗?

以下是该过程所需的输出。

<XML>
<USERLIST ID="something" NAME="Sample">
  <USER ID="userID" NAME="Name"/>
  <USER ID="userID" NAME="Name"/>
  ........
</USERLIST>
<XML>

上面 XML 中的“UserList”只需出现一次

这是我迄今为止的弹簧配置。

<bean id="userXMLWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="resource" value="file:outputs/users.xml" />
    <property name="encoding" value="ISO-8859-1" />
    <property name="version" value="1.0" />
    <property name="marshaller" ref="userXMLMarshaller" />
    <property name="rootTagName" value="XML" />
  </bean>

  <bean id="userXMLMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  <property name="marshallerProperties">
        <map>
            <entry>
                <key>
                    <util:constant static-field="javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT" />
               </key>
              <value type="java.lang.Boolean">true</value>
            </entry>
        </map>
    </property>
    <property name="classesToBeBound">
    <list>
        <value>org.test.model.xml.UserList</value>
        <value>org.test.model.xml.User</value>
    </list>
    </property>
  </bean>   

显然,当我测试这个时,我的 XML 中没有“USERLIST”元素,因为所有这些 USER 对象都需要添加到 USERLIST 的某个位置。我对 Spring Batch 和 JAXB2 有点陌生。对此的任何想法都表示赞赏。

谢谢, 哈里什


解决这个问题的方法是实现 Spring 提供的 Header/Footer Callback 类(正如迈克尔·米内拉在下面的评论中建议的那样.),在我的例子中是 StaxWriterCallback 类。以下是我的实施方式。

<bean id="userXMLWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="resource" value="file:outputs/users.xml" />
    <property name="encoding" value="ISO-8859-1" />
    <property name="version" value="1.0" />
    <property name="marshaller" ref="userXMLMarshaller" />
    <property name="headerCallback" ref="UserXMLHeaderCallBack" />
    <property name="footerCallback" ref="UserXMLFooterCallBack"/>
    <property name="rootTagName" value="XML" />
 </bean>

<bean id="UserXMLHeaderCallBack" class ="org.test.writers.UserXMLHeaderCallBack"/>
<bean id="UserXMLFooterCallBack" class ="org.test.writers.UserXMLFooterCallBack"/>

  <bean id="userXMLMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
     <property name="classesToBeBound">
     <list>
       <value>org.test.model.xml.User</value>
    </list>
    </property>
  </bean>  

下面是页脚/页眉回调类的实现

 public class UserXMLHeaderCallBack implements StaxWriterCallback{  
      @Override
        public void write(XMLEventWriter writer) throws IOException {
            try{
            XMLEventFactory eventFactory = XMLEventFactory.newInstance();

            Attribute id = eventFactory.createAttribute("ID", "someId");
            Attribute name = eventFactory.createAttribute("NAME", "someName");
            List<Attribute> attributeList = Arrays.asList(id, name);
            List<?> nsList = Arrays.asList();

            XMLEvent event = eventFactory.createStartElement("", "", "USERLIST",attributeList.iterator(), nsList.iterator());
            writer.add(event);

            }catch(XMLStreamException e){
                System.err.println("Something went nuts!!!");
            }
        }

    }

页脚类

 public class UserXMLFooterCallBack implements StaxWriterCallback{

    @Override
    public void write(XMLEventWriter writer) throws IOException {
        try{
            XMLEventFactory eventFactory = XMLEventFactory.newInstance();

            XMLEvent event = eventFactory.createEndElement("", "", "USERLIST");
            writer.add(event);
        }catch(XMLStreamException e){
            System.err.println("Something went nuts!!!");
        }
    }

}

我得到了想要的输出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2Marshaller 的相关文章

随机推荐

  • 如何在nodejs中使用objectId

    我用猫鼬写了两个模型 第一个用于用户 另一个用于电影 我在下面写了这个模型 首先 我将所有用户保存在用户集合中 之后我想将我的电影保存到电影收藏中 但是当我想定义导演字段时 出现错误 ReferenceError 导演未定义 const u
  • Flask werkzeug.exceptions.BadRequestKeyError [重复]

    这个问题在这里已经有答案了 我尝试了几种不同的烧瓶应用程序 但每次都会出现以下错误 werkzeug exceptions BadRequestKeyError werkzeug exceptions HTTPException wrap
  • Offline.js - 在线时检查?

    下面是我的代码 简而言之 我不知道如何使连接从在线状态转换为离线状态时更新 css 的事件 https github com hubspot offline 将被触发 如果从离线状态变为在线状态 则会在 10 秒内更新 但我不确定如何让它在
  • 如何在 JavaScript 中将重力应用于弹跳球 -

    我想要从让球在画布上来回弹跳转变为具有一定的重力并最终掉落 我知道当它到达底部时我需要改变速度 但我不知道应该如何完成和编码 我是一名全新的 JS 学生 没有物理背景 这有多难 我很高兴学习等等 我尝试让球碰撞并以正确的角度脱落 但目前看来
  • 附加到 DataFrame 可转换 dtypes

    我正在附加到 pandas DataFrame 并且列的 dtype 以意外的方式转换 import pandas as pd df pd DataFrame a 1 0 b x index 0 print df dtypes df df
  • Node.js Express 未收到请求

    我正在使用 Express Web 框架并尝试从 AngularJS 发出 http 请求 我正在将数据传递给客户端的请求 但服务器由于某些未知原因未收到请求 请帮忙 服务器 js var express require express v
  • 如何使用iPhone SDK创建PDF文档? [复制]

    这个问题在这里已经有答案了 如何使用iPhone SDK创建PDF文档 任何教程和示例都会有所帮助 Thanks Quartz 2D 苹果教程 http developer apple com library mac documentati
  • 使用 Newtonsoft 将 Json 值转换为 Integer

    我使用以下代码向 xml 添加属性 以指定该节点在使用 JsonConvert SerializeXmlNode 时应返回 Integer 值 我已将 Newtonsoft 的更新合并到我引用的 dll 中 我使用以下代码来添加属性 ele
  • 可以从设备内核调用 CULA 例程吗?

    因此 我试图看看使用 GPU 通过同时求解一组问题来求解小型超定方程组是否可以获得显着的加速 我当前的算法涉及使用 CULA Dense 库中的 LU 分解函数 该函数还必须在 GPU 和 CPU 之间来回切换以初始化和运行 CULA 函数
  • 通过 user32.dll 中的 SendInput 发送密钥

    我在用这个板作为演示目的的键盘 无论如何 长话短说 除了极少数情况外 一切正常 我发送击键发送输入函数位于 user32 dll 中 所以我的程序看起来像 static void Main string args Console Write
  • 确定 PHP 中的 Referer

    确定哪个页面发送或调用 通过 AJAX 当前页面的最可靠 最安全的方法是什么 我不想使用 SERVER HTTP REFERER 由于 缺乏 可靠性 我需要调用的页面仅来自我网站上的请求 编辑 我希望验证是否正在从我的网站上的页面调用执行一
  • ValueError:没有为任何变量提供渐变:['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0',

    系统信息 Colab张量流2 2 0 描述当前行为 当我尝试解决自己的数据问题 即多标签语义分割 时 我遇到了这个错误 下面是代码 import tensorflow as tf import tensorflow keras backen
  • Springfox - 更改 swagger-ui 的路径

    现在大摇大摆的服务来自http localhost 8080 myContextRoot swagger ui html 我可以配置 swagger 及其要提供服务的资源吗http localhost 8080 myContextRoot
  • 从 Ansible 事实创建变量

    我有四个系统 在这些系统中我需要提取事实 然后将它们用作 jinja 2 模板上的变量 在 Ansible 中我有 vars office1 web01 myip 10 10 10 10 or fact peer 10 10 10 20 w
  • 无法使用 htmlunit 以编程方式登录 facebook

    我已经尝试过给出的代码HTMLunit Facebook 登录 and 使用 HTMLUnit 使用 Java 以编程方式登录 Facebook 不过我没有登录脸书 启用 JavaScript 后 webClient setJavaScri
  • GoogleTest CMake 无法识别 TEST_F:就像它无法识别 GTest 一样

    好吧 我承认 这是一个特殊的案例 当我们构建应用程序时 我们使用 make 因此我将测试包含在 src 下的测试文件夹中 然后 在与发布文件夹相同的级别 我们创建了一个单元测试文件夹 其中包含所有源文件和测试源文件 但我的IDE是CLion
  • 使用 ROCR 和 pROC (R) 计算平均 AUC 的差异

    我正在使用来自 SVM RFE 模型的交叉验证数据 10 倍重复 5 次 caret包裹 我知道caret包适用于pROC计算指标时包 但我需要使用ROCR包以获得平均 ROC 然而 我注意到使用每个包时的平均 AUC 值并不相同 所以我不
  • 使用 python 在 os.system 的参数中使用行“找不到命令”

    我是 python 新手 正在从事一些 xyz 项目 其中我正在获取第一天日期的报告 获取数据并将其重定向到 Linux 机器上的另一个文件中 这是我的代码 usr bin python import os cur date os pope
  • WCF Web 服务从 SoapUI 超时

    我在 WCF 项目 Net 4 0 中有以下内容 ServiceContract public interface EchoService OperationContract void Ping ServiceBehavior public
  • 使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2Marshaller

    我需要使用 Spring Batch 编写稍微复杂的 XML 谁能帮我进行适当的 Spring 配置吗 以下是该过程所需的输出