Webservice和Unmarshalling异常

时间:2017-02-03 16:47:44

标签: java xml web-services glassfish-4 payara

我正在处理的当前项目涉及从Java应用程序调用许多Web服务。 Web服务托管在运行在虚拟化Linux机器上的payara / glassfish服务器上。 webservices从两个不同的遗留系统返回数据,一个基于SQLServer数据库,另一个基于FoxPro的数据库。

有时,webservice将返回包含xml版本1.0中不允许的值(字节)的数据,并且应用程序将引发一个解组异常,无效字符(0x2)作为响应。 由于我无法控制从数据库中提取的数据,因此我需要找到一种方法来过滤/替换有问题的字符,以便应用程序可以使用这些数据。

我确实可以访问webservice代码,因此如果需要,我可以对服务和客户端进行更改。 我确实读过xml版本1.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)