我正在处理的当前项目涉及从Java应用程序调用许多Web服务。 Web服务托管在运行在虚拟化Linux机器上的payara / glassfish服务器上。 webservices从两个不同的遗留系统返回数据,一个基于SQLServer数据库,另一个基于FoxPro的数据库。
有时,webservice将返回包含xml版本1.0中不允许的值(字节)的数据,并且应用程序将引发一个解组异常,无效字符(0x2)作为响应。 由于我无法控制从数据库中提取的数据,因此我需要找到一种方法来过滤/替换有问题的字符,以便应用程序可以使用这些数据。
我确实可以访问webservice代码,因此如果需要,我可以对服务和客户端进行更改。 我确实读过xml版本1.1允许某些控制字符的地方,但我不确定如何升级该版本,甚至不知道我会这样做。
建议?
答案 0 :(得分:1)
与本教程(https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/part1/chapter6/custom_marshalling.html)一样,您可以通过从MessageBodyReader
接口实现 Object readFrom(Class<Object>, Type genericType,
Annotation annotations[], MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream)
throws IOException, WebApplicationException {
try {
JAXBContext ctx = JAXBContext.newInstance(type);
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
// replace all special characters
theString = theString.replaceAll("[\u0000-\u001f]", "");
return ctx.createUnmarshaller().unmarshal(theString);
} catch (JAXBException ex) {
throw new RuntimeException(ex);
}
}
来制作自定义unmarshaller,如下所示:
numberList.remove(i)