Java 在将file:schemes的URI中的和符号传递到ProducerTemplate.sendboyandheader()时失败

Java 在将file:schemes的URI中的和符号传递到ProducerTemplate.sendboyandheader()时失败,java,apache-camel,Java,Apache Camel,当使用ProducerTemplate.sendboyandheader()将使用“文件”方案的文件发送到其目标时,并且URI中的文件路径包含符号,则无法传递文件,并出现以下错误 org.apache.camel.ResolveEndpointFailedException:未能解析终结点: file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2F1DC55315A/2596/PB&J%20通用%2007064782/转码/21726 原

当使用
ProducerTemplate.sendboyandheader()
将使用“文件”方案的文件发送到其目标时,并且URI中的文件路径包含符号,则无法传递文件,并出现以下错误

org.apache.camel.ResolveEndpointFailedException:未能解析终结点: file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2F1DC55315A/2596/PB&J%20通用%2007064782/转码/21726 原因:未能解析终结点: file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2f1dc5531a5a/25964/PB&J%20通用%2007064782/转码/21726 原因:无效的uri语法:否?但是,标记uri具有&参数分隔符。检查uri是否缺少一个?马克

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

我试着
urlcoder.encode()
在手之前完成它,当然这是不可能的

我甚至调试了camel核心源代码中的
URISupport.normalizeUri(stringuri)
,发现了一些有趣的东西。显然,在发送正文和标题之前,再多的编码都不会对我有任何好处,因为它似乎在进行自己的编码,而且似乎完全不正确。我认为这是
sendboyandheader()中的一个bug
。它在发送之前将符号和编码回URI。这很糟糕。我们为什么要这样做?我们有一个应用程序,从一个部门读取文件并写入共享,另一个系统会在文件处理完成后自动拾取并交付这些文件

请参见下面的camel
URISupport.normalizeUri(字符串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);

如果文件路径中确实需要保留字符,请使用CamelFileName头以避免将端点URI与保留字符弄乱

URI u = new URI(UnsafeUriCharactersEncoder.encode(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");
}

谢谢您的建议,但“CamelFileName”正是我使用的名称,因此使用Exchange.FILE\u。这就扩展到了这一点。你知道,如果由我决定的话,我会用别的东西来代替这个符号,但是我的上级告诉我“它必须接受这个符号,然后把它转过来,保留这个符号,然后把文件交出去”。无论如何,我进入了sendBodyAndHeader()的源代码,发现即使对于“file:”类型方案,也会无条件地调用这个normalizeURI。这是一个问题,它甚至似乎根本不关心标题。在发布答案之前,我确实使用Camel 2.10.3运行了上述代码,并将文件发送到了C:\a&b\hej.txt,但当您这么说时,我意识到Exchange.file_名称与Camel文件名相同。哦,我明白了问题所在,您的文件名带有符号。这不是问题所在。问题是,符号和位于sendBodyAndHeader()的第一个参数的URI中的路径中。我想我可以把路径部分解析出来,只需要硬代码”file:///c:/“并在最后一个参数中的文件名前面加上路径部分。这仅仅是解决这个问题的一个办法,但如果它起作用,我会接受的。这正是我的想法——将amp放在文件名头中,而不是URI中。文件名不是真正的“文件名”,而是整个路径的一部分。您使用的是什么版本的Camel?我假设你使用的是Windows,如果是,是哪个操作系统版本?