Axis2でXML 1.1を使用する
-
19-08-2019 - |
質問
<!> amp;#26;などの文字参照を含む文字列を渡すWebサービスとクライアントがあります。 (0x1A)。これらはXML 1.0では無効ですが、XML 1.1では有効です。 AxisのXMLパーサーは、これらの文字参照のために例外をスローしています。応答をXML 1.1として解析する、またはXML宣言を挿入するように強制する方法はありますか? (現時点ではありません。)ハンドラーの使用を検討しましたが、XMLが既に解析された後に呼び出されることを理解しています。
解決
InputStream
またはReader
を渡しますか?その場合、ソースを別のクラスにラップすることもできますが(BufferedReader
のように)、それを使用して不要な文字をドロップします。
他のヒント
これでかなり苦労すると思います。私の理解では、WSDL 2.0標準はXML 1.0に基づいています。それでは、WSDLで自身を記述し(XML 1.0を想定)、XML 1.1文字を含むメッセージの送信を開始する、どのようなサービスを呼び出すのですか?
Axis2サービスを定義するとき、services.xmlファイルでそのハンドラーを定義できます。たとえば、このページでは、 org.apache.axis2.receivers.RawXMLINOutMessageReceiverを使用しました...それはあなたがやろうとしていることではありませんが、見たり考えたりする場所になるかもしれません。
もう1つのオプションがあります-パーサーが入力をXML 1.1として扱うようにするためです。
Axis2はWoodstoxパーサーを使用しているため、WstxInputFactory
を拡張してメソッドcreatePrivateConfig()
:
@Override
public ReaderConfig createPrivateConfig() {
ReaderConfig config = super.createPrivateConfig();
config.enableXml11(true);
return config;
}
システムプロパティを介してカスタムファクトリを使用します: -Djavax.xml.stream.XMLInputFactory = mypackage.MyWstxInputFactory
このような回避策は、無効なXMLを生成するバグのあるWebサービスを絶対に変更できない場合にのみ注意してください。副作用が発生する可能性があります。