Java Webservice和解组异常

Java Webservice和解组异常,java,xml,web-services,glassfish-4,payara,Java,Xml,Web Services,Glassfish 4,Payara,我正在从事的当前项目涉及从java应用程序调用大量Web服务。这些Web服务托管在虚拟linux机器上运行的payara/glassfish服务器上。webservices从两个不同的遗留系统返回数据,一个基于SQLServer数据库,另一个基于FoxPro数据库 有时候,webservice会返回包含xml版本1.0中不允许的值(字节)的数据,应用程序会抛出一个解组异常,即响应中的无效字符(0x2)。 由于我无法控制从数据库获取的数据,因此我需要找到一种方法来过滤/替换有问题的字符,以便应用程

我正在从事的当前项目涉及从java应用程序调用大量Web服务。这些Web服务托管在虚拟linux机器上运行的payara/glassfish服务器上。webservices从两个不同的遗留系统返回数据,一个基于SQLServer数据库,另一个基于FoxPro数据库

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

我确实可以访问webservice代码,因此如果需要,我可以对服务和客户端进行更改。 我确实在某个地方读到过xml版本1.1允许某些控制字符,但我不知道如何升级该版本,甚至不知道在哪里升级

建议?

与本教程()类似,您可能可以通过从接口
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);
      }
   }
对象读取自(类,类型genericType,
注释注释[],MediaType MediaType,
多值MAP HttpHeader,
输入流(实体流)
抛出IOException、WebApplicationException{
试一试{
JAXBContext ctx=JAXBContext.newInstance(类型);
StringWriter编写器=新的StringWriter();
复制(输入流、写入器、编码);
字符串theString=writer.toString();
//替换所有特殊字符
字符串=字符串.replaceAll(“[\u0000-\u001f]”,“”);
返回ctx.createUnmarshaller().unmarshal(字符串);
}捕获(JAXBEException-ex){
抛出新的运行时异常(ex);
}
}

尝试使用示例代码,在调用unmarshal时,我收到一个错误,因为字符串不是一个可接受的参数。更正了参数问题,现在读取器可以工作了。似乎我还需要在webservice方面做一些事情,因为服务器偶尔也会阻塞数据。不过,这方面的错误似乎有点不同,因为调用封送拆收器时出现超时错误。