Java 使用Spring集成读取/写入XML文件
我目前正在使用Spring集成实现一些导入/导出机制,总的来说进展很顺利,但在功能方面似乎存在差距,我不了解: 有一个用于轮询目录、写入文件。。。我可以用它轮询一个目录,并为我感兴趣的每个文件获取一条Java 使用Spring集成读取/写入XML文件,java,xml,file,spring-integration,Java,Xml,File,Spring Integration,我目前正在使用Spring集成实现一些导入/导出机制,总的来说进展很顺利,但在功能方面似乎存在差距,我不了解: 有一个用于轮询目录、写入文件。。。我可以用它轮询一个目录,并为我感兴趣的每个文件获取一条消息 对于处理文档对象,可以使用XPath、XSLT等。。。我可以使用它来分析XML文档、使用XPath丰富标题、拆分文档等等 我缺少的是两者之间的联系: 给定一个XML文件将被丢弃到的目录,我想要一个通道,其中每个文件都包含一条消息 给定一个带有消息的频道,我想要一个将每个频道写入文件的配置
消息
对于处理文档
对象,可以使用XPath、XSLT等。。。我可以使用它来分析XML文档、使用XPath丰富标题、拆分文档等等
我缺少的是两者之间的联系:
- 给定一个XML文件将被丢弃到的目录,我想要一个通道,其中每个文件都包含一条
消息
- 给定一个带有
消息的频道
,我想要一个将每个频道写入文件的配置
封送拆收器/解封拆收器似乎正是我想要的(或者至少让我对字节[]
有了一半了解),但它们似乎只能通过某种映射框架将文档
转换为POJO或从POJO转换成POJO
对于解析,我可以使用以下简单类:
public class FileToDocumentTransformer extends AbstractFilePayloadTransformer<Document> {
@Override
protected Document transformFile(File file) throws Exception {
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
}
}
公共类FileToDocumentTransformer扩展了AbstractFilePayloadTransformer{
@凌驾
受保护的文档转换文件(文件文件)引发异常{
返回DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(文件);
}
}
但我还没有找到一个合适的对策,我不能相信Spring集成还没有内置这种微不足道的功能
我缺少什么?请参阅DefaultXmlPayloadConverter.convertToDocument
。此转换器在许多端点内部使用(尤其是XPath,但其他端点也是如此)。它可以处理文件和字符串有效载荷。您也可以将其作为转换器直接调用
有关更多信息,请参阅中的transformer
包。我最后编写了这个类:
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>
对我来说,这是一个
,否则你当然需要输入通道和输出通道
我很确定这不是最好的解决方案(这就是为什么我一开始问这个问题),但它对我很有效。对不起,也许我很密集,但我仍然不明白:我必须自己定义这种类型的bean吗?理想情况下,我正在寻找一些简单的配置(可能是集成xml名称空间)或一个可以用作服务激活器的表达式。