web-dev-qa-db-ja.com

CXFを使用するときにWS出力の無効な文字を処理するにはどうすればよいですか?

Spring、CXF、Hibernateを使用して、読み取り専用アクセス権を持つ外部データベースで検索クエリを実行するWebサービスを構築しています。

問題は、データベースの一部のエントリのテキストフィールドに奇妙な文字(0x2)があり、Hibernateセッションから返されたオブジェクトを処理/シリアル化するために使用するCXFまたはライブラリ(Aegis?)が処理できないように見えることです。それ:

org.Apache.cxf.Aegis.DatabindingException: Error writing document.. Nested exception is com.ctc.wstx.exc.WstxIOException: Invalid white space character (0x2) in text to output (in xml 1.1, could output as a character entity)

どうすればそれを回避できますか?理想的には、これらの文字は出力に関係ないので、削除するだけで済みます...ありがとうございます。

18
Elias Dorneles
/**
* From xml spec valid chars:<br>
* #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]<br>
* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.<br>
* @param text The String to clean
* @param replacement The string to be substituted for each match
* @return The resulting String
*/
public static String CleanInvalidXmlChars(String text, String replacement) {
    String re = "[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF]";
    return text.replaceAll(re, replacement);
}

ソース: http://www.theplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-characterheplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-character

16
nDijax

これがあなたの質問に答えるかどうかはわかりませんが、これが私が見つけたものです。

例外をスローするクラスは次のとおりです。 http://svn.codehaus.org/woodstox/wstx/trunk/src/Java/com/ctc/wstx/api/InvalidCharHandler.Java

ここでこの問題に関する議論があるようです: http://comments.gmane.org/gmane.comp.Apache.cxf.user/437

多分これはあなたができるかもしれません:エンドポイント/バスの「disable.outputstream.optimization」プロパティをtrueに設定して、直接を無効にすることもできます出力ストリームに書き込み、常にXMLStreamWriterを通過します。 SAAJModelを作成するオーバーヘッドなしで同じことを達成する必要があります。

これが少し役立つことを願っています。

8
Jarle Hansen

目的の動作を実現し、例外がスローされないようにするには、デフォルトのWoodstoksファクトリcom.ctc.wstx.stax.WstxOutputFactoryを独自のもので拡張する必要があります。これは、プロパティcom.ctc.wstx.outputInvalidCharHandlercom.ctc.wstx.api.InvalidCharHandler.ReplacingHandlerのインスタンスで上書きするだけです。このハンドラーは、コンストラクター引数として、無効な文字への置換文字を取ります。インスタンスを手元に置いて、META-INF/services/javax.xml.stream.XMLOutputFactoryという名前のファイルを作成し、その中に実装の完全な名前のみを配置します(結果のjarのMETA-INF/servicesディレクトリ内に配置されることを確認してください)。

あなたはより多くの詳細を見つけることができます ここ

HTH!

1
cristianoms

与えられたUnicodeエンコーディングが拒否されたため、最高評価の回答は私には機能しませんでした。ただし、わずかな変更を加えると、目的の動作が表示されました。

public static String CleanInvalidXmlChars(String text, String replacement) {
    String re = "[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\\u0001\\u0000-\\u0010\\uFFFF]";
    return text.replaceAll(re, replacement);
}
0
Lizard