服务器上service要不要报类似的错:com.ctc.wstx.exc.WstxIOException: Invalid white space character (0x13) in text to output
Caused by: java.io.IOException: Invalid white space character (0x13) in text to output
at com.ctc.wstx.sw.XmlWriter.throwInvalidChar(XmlWriter.java:545)
at com.ctc.wstx.sw.BufferingXmlWriter.writeCharacters(BufferingXmlWriter.java:531)
at com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:509)
为了查出为查出出错原因,还下了一番功夫终于找出问题根源,说一下排查经过。
1、日志里没有记录具体的原因,我很想知道啥字符引起,为了拦截出错字符,更改代码
BaseStreamWriter.writeCharacters中的代码,抛出出错字符来定位问题
throw new WstxIOException("******ERROR TRACK!*********\n"+text);
来显示出错字符,根据出错字符再去服务器查找相应的来源定位具体的内容
编译后替换原来的jar包,等待异常输出,
经过一段时间的等待,查到日志情况如下:
com.ctc.wstx.exc.WstxIOException: ******************ERROR TRACK!********************Error writing document.. Nested exception is com.ctc.wstx.exc.WstxIOException: ******************ERROR TRACK!********************<p>输入: 16 路 HDMI <br />
输出: 1 HDMI <br />
带宽: 支持 1.65Gbps <br />
和 HDMI 标准兼容: 支持 HDMI 1.2 and HDCP <br />
分辨率: Up to UXGA; 1080p <br />
电源: 90 240VAC; 50/60Hz, 22VA <br />
控制: 前面板按键, 远红外, RS-232, Ethernet <br />
尺寸: 19-inch (W), 7-inch (D), 1U (H) <br />
重量: 2.5 kg. (5.5 lbs.) approx. <br />
附件: 电源 <br />
选择: Kramer HDMI 电缆</p>
通过上面有用信息查找出是有个不可显示字符引起报错90 240VA 中间的这个方框,
弄java 字符串里如下:"90\u0003240VAC; "
找到原因后我们可以对不可见字符串进行处理,以后再也不会有问题了。
/**
* 清理xml不支持的特殊字符
* @param data
* @return
*/
public static String handleXMLSpecialChar(String data) {
StringBuffer appender = new StringBuffer("");
if (StringUtils.isNotBlank(data)) {
appender = new StringBuffer(data.length());
for (int i = 0; i < data.length(); i++) {
char ch = data.charAt(i);
if ((ch == 0x9) || (ch == 0xA) || (ch == 0xD) || ((ch >= 0x20) && (ch <= 0xD7FF)) || ((ch >= 0xE000) && (ch <= 0xFFFD))
|| ((ch >= 0x10000) && (ch <= 0x10FFFF)))
appender.append(ch);
}
}
return appender.toString();
}