1

現在、Java 1.4 を使用する Weblogic Server 8,1 sp5から Java 1.7 を使用する 10.3.6 に機能を移行中です。

以下に記載されているケースは、旧サーバーでは正常に動作していますが、新サーバーへのハンドリングの移行時に問題が発生しています。問題は、SOAP 呼び出しを介して外部システムから取得された XML 応答を取得して解析するときに発生します。

このメソッドでは、次のライブラリとプロシージャが使用されます。

  1. 接続を確立するjava.net.HttpURLConnection
  2. リクエストを送信するjava.io.OutputStream
  3. 応答を取得するjava.io.InputStream
  4. 文字列に変換する前に結果を格納するbyte[]
  5. String をorg.w3c.dom.Documentに変換するjavax.xml.parsers.DocumentBuilderjava.io.StringReaderおよびorg.xml.sax.InputSource
  6. 次の例外がスロー されます。

notepad++ を使用してアプリケーションのログを開くと、ファイルの末尾に多くの null 文字が表示され、問題の原因と思われます。古いサーバーからのリクエストを実行する場合、そのようなケースは発生しないことを繰り返します。

それぞれのコードは次のとおりです。

//Creating the connection
URL u = new URL(default_server);
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection) uc;

connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod(requestMethod);
connection.setRequestProperty("SOAPAction", soap_action);

OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);

wout.write(xmlString);
wout.flush();
wout.close();

InputStream in = connection.getInputStream();

int c = in.available();
byte r[] = new byte[c];
in.read(r);
String response = new String(r);
connection.disconnect();

//Transorming the String to XML Doc
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
StringReader theReader = new StringReader(response);
InputSource theInputSource = new InputSource();
theInputSource.setCharacterStream(theReader);
Document doc = builder.parse(theInputSource); 
//Here occurs org.xml.sax.SAXParseException-Content is not allowed in trailing section

return doc;

ジャンク文字から応答を取り除くことで問題を解決できることはわかっていますが、これは安全な解決策ではありません。この件について共有する情報はありますか?それは Java のバージョンの問題だと思いますか、それともサーバーの構成の問題でしょうか? よろしくお願いします。

敬具、ジョージ

4

1 に答える 1

2

2つの問題があります

  • in.available()javadocによると:バイト数の見積もりを返します...これに依存しないでください。8Kのバッファーをループして、最後まで、またはそれ以上になるまでストリームを読み取ります。車輪の再発明を行わず、Apacheのcommons-ioを使用し、ÌOUtils.read
  • String response = new String(r);これを行うと、受信したバイトがプラットフォームのエンコーディング/文字セットと同じ文字セットを使用してエンコードされていると想定しています。WindowsまたはOSXを使用している場合は、そうなる可能性はほとんどありません。文字セットを渡し、コンストラクターを使用する必要がありますString(byte[] bytes, Charset charset)
于 2013-03-20T14:45:36.757 に答える