我们正在将功能从带有 java 1.4 的 Weblogic Server 8,1 sp5迁移到带有 java 1.7 的 10.3.6。
下面描述的情况在旧服务器中正常工作,但是在将处理转移到新服务器时我们遇到了问题。问题在于检索和解析通过 SOAP 调用从外部系统检索的 XML 响应。
该方法中使用了以下库和过程:
- java.net.HttpURLConnection建立连接
- java.io.OutputStream发送请求
- java.io.InputStream获取响应
- byte[]在转换为String之前存储结果
- javax.xml.parsers.DocumentBuilder、java.io.StringReader和org.xml.sax.InputSource将 String 转换为org.w3c.dom.Document
- 引发以下异常: “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 版本问题还是服务器配置问题?提前感谢您的时间。
最好的问候,乔治