【问题标题】:Reading/Writing XML Files with Spring Integration使用 Spring 集成读取/写入 XML 文件
【发布时间】:2020-06-11 19:58:12
【问题描述】:

我目前正在使用 Spring Integration 实现一些导入/导出机制,总的来说一切都很顺利,但似乎在我不理解的功能上存在差距:

Spring Integration File 用于轮询目录、写入文件……我可以使用它来轮询目录并为我感兴趣的每个文件获取Message<File>

Spring Integration XML 用于处理Document 对象,应用XPath,XSLT,...我可以用它来分析XML 文档,使用XPath 丰富标题,拆分文档,...

我缺少的是两者之间的联系:

  • 给定一个存放 XML 文件的目录,我想要一个通道,其中每个文件都包含一个 Message<Document>
  • 给定一个带有Message<Document> 的频道,我想要一个将每个频道写入文件的配置。

Marshallers/Unmarshallers 似乎正是我正在寻找的东西(或者至少将我带到 byte[] 的一半),但他们似乎只是能够通过一些映射框架将Document 转换为 POJO 或从 POJO 转换。

对于解析,我可以通过这个简单的类帮助自己:

public class FileToDocumentTransformer extends AbstractFilePayloadTransformer<Document> {
    @Override
    protected Document transformFile(File file) throws Exception {
        return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    }
}

但我还没有找到合适的对应物并且我不敢相信 Spring Integration 还没有内置这种微不足道的能力。

我错过了什么?

【问题讨论】:

    标签: java xml file spring-integration


    【解决方案1】:

    DefaultXmlPayloadConverter.convertToDocument。这个转换器在许多端点内部使用(特别是 XPath,但也有其他端点)。它可以处理文件和字符串有效负载。您也可以直接将其作为转换器调用。

    有关更多信息,请参阅 spring-integration-xml project 中的 transformer 包。

    【讨论】:

    • 对不起,我可能很密集,但我还是不明白:我必须自己定义一个那种类型的 bean 吗?理想情况下,我正在寻找一些简单的配置(可能使用 integration-xml 命名空间)或可以用作服务激活器的单个表达式。
    【解决方案2】:

    我已经写完了这门课:

    public class DocumentToBytesTransformer {
        public byte[] transform(Document document) throws Exception {
            Transformer tr = TransformerFactory.newInstance().newTransformer();
            tr.setOutputProperty(OutputKeys.INDENT, "yes");
            tr.setOutputProperty(OutputKeys.METHOD, "xml");
            tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
            tr.transform(new DOMSource(document), new StreamResult(baos));
            return baos.toByteArray();
        }
    }
    

    使用此配置:

    <int:service-activator method="transform">
        <bean class="package.DocumentToBytesTransformer"/>
    </int:service-activator>
    

    对我来说这是&lt;chain&gt;,否则你当然需要input-channeloutput-channel

    非常确定这不是最好的解决方案(这就是我首先提出这个问题的原因),但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多