CharConversionException during Servlet Post method - Need fix.
993525Feb 26 2013 — edited Feb 27 2013XML request message using HTTP POST is received by the Servlet interface.
While we are reading and trying to parse the InputStreamObject, we are getting the following error message.
doPost java.io.CharConversionException: Characters larger than 4 bytes are not supported: byte 0x8e implies a length of more than 4 bytes
It looks like we are receiving some invalid Non-ASCII characters in the XML message.
The above error is thrown intermittently.
Whenever we have this CharConversionException, the servlet gets corrupted and it impacts few good xml messages that follows after the error.
I need to know the following:
1. How to fix this exception and skip the bad message?
2. Is it possible to log the entire xml message in the catch block, whenever we have this exception?
NOTE: we tried different ways, not able to print the xml message, as the inputstream seems to be closed/null, when it reaches the catch block.
Tried the below code , but the servlet process/thread hungs and throws the below error:
Thread "WebContainer : 3" (00000028) has been active for 667781 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung.
Below is the code snippet:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
request.setCharacterEncoding("ISO-8859-1");
OutputStream out = response.getOutputStream();
InputStream inputStream=null;
InputStream inputStreamTemp=null;
try {
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = null;
iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
inputStream = item.openStream();
inputStreamTemp=inputStream;
// we are trying to process the input stream
processXml(inputStream);
}
}
catch(CharConversionException charConversionException){
this.logger.error(charConversionException);
if(inputStreamTemp !=null){
logSlurp(inputStreamTemp,logger);
}
}
private static void logSlurp(InputStream in, Log logger) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[in.available()];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
if (logger.isInfoEnabled()) {
logger.info(out.toString());
}
}
}
Need any help to fix the issue we are facing? Issue of either fixing/overcoming the actual exception and printing out the entire xml message(bad one) in ours log
during the catch block.
Thanks a lot.