2017-02-03 72 views
2

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

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

我确实可以访问web服务代码,所以如果需要的话,我可以对服务和客户端进行更改。 我的确在某处读过xml版本1.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); 
     } 
    } 
+0

试图使用您的示例代码,并在调用解组,我得到由于String不是一个易于理解的参数,因此出现错误。 – kpenrose

+0

更正了参数问题,现在读者正常工作。似乎我也需要在web服务端做些事情,因为服务器偶尔会扼杀数据。这方面的错误似乎有点不同,因为在对编组人员的调用中有一个超时错误。 – kpenrose