ProducerTemplate.sendBodyAndHeader()
「ファイル」スキームを使用して宛先にファイルを送信するために を使用し、URI のファイル パスにアンパサンドが含まれている場合、次のエラーでファイルの配信に失敗します。
org.apache.camel.ResolveEndpointFailedException: エンドポイントの解決に失敗しました: file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2f1dc5531a5a/2596/PB&J%20Generic%2007064782/transcoded/21726 原因:エンドポイントの解決に失敗しました: file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2f1dc5531a5a/25964/PB&J%20Generic%2007064782/transcoded/21726 原因: 無効な URI 構文: いいえ? マーカーですが、URI には & パラメータ区切り文字があります。欠落している場合は uri を確認してください。マーカー。
ファイルsend()
、sendBody()
、sendBodyAndHeader()
さらにはsendBodyAndHeaders()
.
私は事前にそれを試みましUrlEncoder.encode()
たが、もちろんノーゴーです。
URISupport.normalizeUri(String uri)
camel-core ソースからデバッグしたところ、興味深いことがわかりました。どうやら、本文とヘッダーを送信する前に、エンコードの量がまったく役に立たないようです。これは、独自のエンコードを行っているようで、まったく正しくないように見えるためです。これは のバグだと思いますsendBodyAndHeader()
。アンパサンドを URI にエンコードしてから送信します。これは悪いです。なぜ私たちはそれをしているのですか?ある部門からファイルを読み取り、共有に書き込まれるアプリケーションと、ファイルの処理が終了したときにそれらのファイルを自動的に取得して配信する別のシステムがあります。
以下を参照してください。キャメルURISupport.normalizeUri(String uri)
メソッドはここで URI をエンコードしています。これにより、アンパサンドがファイル パスに戻されます。
URI u = new URI(UnsafeUriCharactersEncoder.encode(uri));
したがって、sendBodyAndHeader はやりたいことを何でも実行するため、URI のファイル パスに対する前処理がまったく機能しないことがわかります。この 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);