Web 服务和解组异常
Webservice and Unmarshalling exception
我目前正在进行的项目涉及从 java 应用程序调用多个网络服务。 Web 服务托管在 payara/glassfish 服务器 运行 的虚拟化 linux 盒子上。来自两个不同遗留系统的 Web 服务 return 数据,一个基于 SQLServer 数据库,另一个基于 FoxPro 数据库。
偶尔,webservice会return包含xml1.0版本不允许的值(字节)的数据,应用程序抛出解组异常,invalid character (0x2) in回复。
由于我无法控制从数据库中获取的数据,因此我需要找到一种方法来 filter/replace 违规字符,以便应用程序可以使用这些数据。
我确实可以访问网络服务代码,因此我可以根据需要对服务和客户端进行更改。
我确实在某处读到 xml 1.1 版允许使用某些控制字符,但我不确定如何升级该版本,甚至不确定我会在哪里升级。
建议?
与本教程一样 (https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/part1/chapter6/custom_marshalling.html),您可能可以通过从接口 MessageBodyReader
实现 readFrom
来制作自定义解组器,如下所示:
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);
}
}
我目前正在进行的项目涉及从 java 应用程序调用多个网络服务。 Web 服务托管在 payara/glassfish 服务器 运行 的虚拟化 linux 盒子上。来自两个不同遗留系统的 Web 服务 return 数据,一个基于 SQLServer 数据库,另一个基于 FoxPro 数据库。
偶尔,webservice会return包含xml1.0版本不允许的值(字节)的数据,应用程序抛出解组异常,invalid character (0x2) in回复。 由于我无法控制从数据库中获取的数据,因此我需要找到一种方法来 filter/replace 违规字符,以便应用程序可以使用这些数据。
我确实可以访问网络服务代码,因此我可以根据需要对服务和客户端进行更改。 我确实在某处读到 xml 1.1 版允许使用某些控制字符,但我不确定如何升级该版本,甚至不确定我会在哪里升级。
建议?
与本教程一样 (https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/part1/chapter6/custom_marshalling.html),您可能可以通过从接口 MessageBodyReader
实现 readFrom
来制作自定义解组器,如下所示:
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);
}
}