将文件:scheme的URI中的&符号传递给ProducerTemplate.sendBodyAndHeader()时,它会失败

时间:2012-12-15 02:17:57

标签: java apache-camel

使用ProducerTemplate.sendBodyAndHeader()使用“文件”方案将文件发送到目的地,并且URI中的文件路径包含&符号时,无法传送出现以下错误的文件。

  

org.apache.camel.ResolveEndpointFailedException:无法解析端点:   文件:/// C%7C / IMM_SAN /营销/ f77333bd-f96f-4873-b846-2f1dc5531a5a / 2596 / PB&安培;Ĵ%20Generic%2007064782 /代码转换/ 21726   由于:无法解析端点:   文件:/// C%7C / IMM_SAN /营销/ f77333bd-f96f-4873-b846-2f1dc5531a5a / 25964 / PB&安培;Ĵ%20Generic%2007064782 /代码转换/ 21726   由于:uri语法无效:不是吗?然而,uri有&标记。参数分隔符。检查uri是否遗漏了?标记

花几天时间尝试不同的重载来发送文件send()sendBody()sendBodyAndHeader()甚至sendBodyAndHeaders()

我事先尝试UrlEncoder.encode(),当然不行。

我甚至从camel-core源调试URISupport.normalizeUri(String uri)并发现了一些有趣的东西。显然没有多少编码会在发送正文和标题之前对我有任何好处,因为它似乎在做自己的编码而且看起来完全不正确。我认为这是sendBodyAndHeader()中的错误。它在发送之前将&符号编码回URI。这是不好的。我们为什么这样做?我们有一个应用程序,它从一个部门读取文件并写入共享,另一个系统自动选择这些文件,并在文件处理完成后交付。

请参阅下面的camel URISupport.normalizeUri(String uri)方法在此处对URI进行编码,这会将&符号放回文件路径中。

URI u = new URI(UnsafeUriCharactersEncoder.encode(uri));

所以你看到URI中的文件路径上的预处理数量根本不会起作用,因为sendBodyAndHeader会做任何感觉。我想在此API中添加一个新的重载来关闭规范化,并按原样发送URI。但是想在这里查看是否有人有任何不那么激烈的选择。请注意,当&符号位于文件方案的URI路径中时,这是一个问题。

ProducerTemplate prod = exchange.getContext().createProducerTemplate();
destPath = destPath.replace(':', '|');
destPath = destPath.replaceAll("\\\\", "/");
destPath = destPath.replaceAll("&", "%26");  // replace the ampersand
String query = "file:///" + destPath;
prod.sendBodyAndHeader(query, exchange.getIn().getBody(), Exchange.FILE_NAME, destFileName);

1 个答案:

答案 0 :(得分:0)

使用CamelFileName标头可以避免将端点URI与保留字符&如果你真的需要文件路径中的那个字符。

此示例会将文件放入c:\a&b

public void sendAnyFile(Exchange e){
    ProducerTemplate pt = getContext().createProducerTemplate();
    pt.sendBodyAndHeader("file:///c:/",e.getIn().getBody(String.class), "CamelFileName", "a&b/hej.txt");
}