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[]在转换为String之前存储结果
  5. javax.xml.parsers.DocumentBuilderjava.io.StringReaderorg.xml.sax.InputSource将 String 转换为org.w3c.dom.Document
  6. 引发以下异常: “org.xml.sax.SAXParseException - 尾部不允许有内容。”

使用记事本++ 打开应用程序的日志时,文件末尾出现许多空字符,这似乎是导致问题的原因。我再说一遍,从旧服务器执行请求时不会出现这种情况。

相应的代码如下:

//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

我看到两个问题

  • 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 回答