0

我目前正在使用 Spring Integration 实现一些导入/导出机制,总而言之,它进行得很好,但似乎在我不理解的能力方面存在差距:

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

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

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

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

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

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

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

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

我错过了什么?

4

2 回答 2

1

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

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

于 2013-10-18T18:25:55.233 回答
0

我最终写了这门课:

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>

对我来说,这是在 a 中<chain>,否则你当然需要input-channeland output-channel

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

于 2013-10-21T08:40:08.830 回答