我有一个webservice,客户端传递了一些带有无效xml字符的字符串。在服务器端解析请求时,JAXWS会因为无法解析这些无效的xml字符而抛出异常。
为了解决这个问题,我尝试创建以下SOAPHandler。在下面的SOAPHandler中,我尝试迭代子元素,这意味着我已经在解析xml并且在处理程序本身中遇到了异常。
如何从消息中删除无效的xml字符?
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
public class InvalidXmlCharacterHandler implements SOAPHandler<SOAPMessageContext>{
private static final Logger LOGGER = Logger.getLogger(InvalidXmlCharacterHandler.class);
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("Server : handleMessage()......");
Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
//for request message only
if(!isRequest){
SOAPMessage soapMsg = context.getMessage();
if (soapMsg != null) {
try {
java.util.Iterator iterator = soapMsg.getSOAPBody().getChildElements();
while (iterator.hasNext()) {
SOAPBodyElement bodyElement = (SOAPBodyElement) iterator.next();
String val = bodyElement.getTextContent();
bodyElement.setTextContent(stripNonValidXMLCharacters(val));
System.out.println("The Value is:" + val);
}
} catch (SOAPException ex) {
LOGGER.error("Failed to get and set source", ex);
}
}
}
//continue other handler chain
return true;
}
public static String stripNonValidXMLCharacters(String in) {
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
if (in == null || ("".equals(in))) return ""; // vacancy test.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught here; it should not happen.
if ((current == 0x9) ||
(current == 0xA) ||
(current == 0xD) ||
((current >= 0x20) && (current <= 0xD7FF)) ||
((current >= 0xE000) && (current <= 0xFFFD)) ||
((current >= 0x10000) && (current <= 0x10FFFF)))
out.append(current);
}
return out.toString();
}
@Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("Server : handleFault()......");
return true;
}
@Override
public void close(MessageContext context) {
System.out.println("Server : close()......");
}
@Override
public Set<QName> getHeaders() {
System.out.println("Server : getHeaders()......");
return null;
}
}