Mule无法正确解析WebService返回的XML该如何解决?
解决BufferInputStream序列化报错的问题
嘿,这个问题我之前也碰到过!其实核心原因就是你用的序列化框架(大概率是Jackson)没法直接把org.glassfish.grizzly.utils.BufferInputStream这种流对象转换成响应格式——它既不是标准的Java Bean,也没有可被序列化的属性,所以才会抛出那个"No serializer found"的错误。
下面分两种常见场景给出解决方法:
方法一:把流转换成XML字符串再返回
这是最直接的方式,先把BufferInputStream里的XML内容读取成字符串,再返回这个字符串。这样框架就能正常处理字符串的输出了。
用Apache Commons IO简化操作
如果你项目里已经引入了Apache Commons IO依赖,一行代码就能搞定:
import org.apache.commons.io.IOUtils; import java.nio.charset.StandardCharsets; // 获取到WebService返回的BufferInputStream BufferInputStream inputStream = (BufferInputStream) httpResponse.getEntity(); // 把流转换成XML字符串 String xmlResponse = IOUtils.toString(inputStream, StandardCharsets.UTF_8); // 直接返回这个字符串即可 return xmlResponse;
不依赖第三方库的实现
如果不想引入额外依赖,自己写代码读流也很简单:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; BufferInputStream inputStream = (BufferInputStream) httpResponse.getEntity(); StringBuilder xmlBuilder = new StringBuilder(); String line; try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { while ((line = reader.readLine()) != null) { xmlBuilder.append(line); } } String xmlResponse = xmlBuilder.toString(); return xmlResponse;
方法二:直接将流写入响应输出流(绕过序列化)
如果你的接口需要直接返回XML格式的响应(而不是字符串),可以跳过框架的序列化步骤,直接把流内容写入HTTP响应的输出流,同时设置正确的Content-Type。
以Spring MVC为例:
import org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @GetMapping("/your-endpoint") public void handleWebServiceResponse(HttpServletResponse response) throws IOException { // 获取WebService返回的BufferInputStream BufferInputStream inputStream = (BufferInputStream) yourHttpConnectorCall(); // 设置响应的Content-Type为XML response.setContentType("application/xml"); response.setCharacterEncoding("UTF-8"); // 把流内容写入响应输出流 IOUtils.copy(inputStream, response.getOutputStream()); response.getOutputStream().flush(); }
这样做的好处是不需要把整个XML加载到内存里,对于大体积的XML响应更高效。
内容的提问来源于stack exchange,提问作者SpasemanSpiph
相关产品推荐
相关产品推荐

