我目前正在使用Spring Integration实现一些导入/导出机制,总而言之,它很顺利,但似乎在我不理解的功能方面存在差距:
有Spring Integration File用于轮询目录,写入文件,...我可以使用它来轮询目录并为我感兴趣的每个文件获取Message<File>
。
有Spring Integration XML用于处理Document
个对象,应用XPath,XSLT,...我可以用它来分析XML文档,使用XPath丰富标题,拆分文档,......
我缺少的是两者之间的联系:
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还没有内置这种琐碎的能力。
我错过了什么?
答案 0 :(得分:1)
请参阅DefaultXmlPayloadConverter.convertToDocument
。此转换器在许多端点内部使用(特别是XPath,但也包括其他端点)。它可以处理文件和字符串有效负载。您也可以直接将其作为变换器调用。
有关详细信息,请参阅spring-integration-xml project中的transformer
包。
答案 1 :(得分: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>
对我而言,这是<chain>
,否则您当然需要input-channel
和output-channel
。
我非常确定这不是最好的解决方案(这就是我首先提出这个问题的原因),但它对我有用。