buffalo框架不支持标准xml请求体的自动解析,仅处理其自定义二进制或burlap协议;接收application/xml需手动从httpservletrequest读取流并用dom/sax等解析,不可依赖其内置绑定机制。

Buffalo 框架本身不提供 XML 请求体的自动解析能力,它默认只处理其自定义的二进制协议(2.0+)或早期的 Burlap 协议。如果你收到的是标准 XML 格式的 HTTP 请求(比如 Content-Type: application/xml),Buffalo 不会像 Spring MVC 那样通过 @RequestBody 自动绑定到 Java 对象——你得自己读取、解析、转换。
Buffalo 的 XML 处理边界在哪
Buffalo 的核心定位是 Web Remoting:它让 JavaScript 调用 Java 方法像调用本地函数一样,底层走的是自描述 XML 协议(1.x)或私有二进制协议(2.0+)。这个“XML”是 Buffalo 自己生成和消费的序列化格式,不是通用 XML 文档。所以:
- 它不暴露
XmlPullParser或类似 API 给用户做任意 XML 解析 - 它不支持
@XmlRootElement或 JAXB 注解自动反序列化外部 XML - 它的
BuffaloBinding只绑定 JS 对象到 HTML 元素,不参与 HTTP 请求体解析
如何手动解析 XML 请求体(Java 端)
当你的 Buffalo 服务端(比如一个 BuffaloService 子类)需要接收并处理外部发来的原始 XML 报文时,必须绕过 Buffalo 的默认流程,直接从 HttpServletRequest 中读取流:
- 在
doPost或doGet方法里,调用request.getInputStream()获取原始字节流 - 用标准 Java 工具解析:如
DocumentBuilder.parse(InputStream)(DOM)、SAXParser(事件驱动)、或更轻量的XmlPullParser(需引入第三方库如xmlpull) - 注意设置请求编码:
request.setCharacterEncoding("UTF-8"),否则中文可能乱码 - 别依赖
request.getParameter()—— 它对 XML 体无效,只对application/x-www-form-urlencoded有效
示例片段(DOM 方式):
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(request.getInputStream());
为什么不能用 Buffalo 的内置机制替代手动解析
因为 Buffalo 的协议层在 Servlet Filter 或 DispatcherServlet 之前就完成了反序列化。一旦请求被识别为 Buffalo 调用(比如路径匹配 /buffalo/*),框架就会尝试用它自己的协议解析器去读取 body —— 如果你塞进去的是通用 XML,它会直接报错,例如:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
org.xml.sax.SAXParseException: Content is not allowed in prolog.
这个错误通常意味着 Buffalo 尝试用它的 XML Schema 去校验一段不符合其结构的 XML(比如开头多了 <?xml version="1.0"?> 或根元素不是 <buffalo></buffalo>)。它不会 fallback 到通用 XML 解析逻辑。
实际部署时最常踩的坑
很多人试图把 Buffalo 和通用 XML 接口混在一个应用里,结果发现:
- 同一个 Servlet 容器里,Buffalo 的
BuffaloFilter会拦截所有匹配路径的请求,包括你本想自己处理的/api/order—— 必须配置url-pattern排除非 Buffalo 路径 - 没关掉 Buffalo 的自动 content-type 检查,导致
application/xml请求被拒绝,日志里只有沉默的 400 - 用
request.getReader()读了一次流,再调用getInputStream()就抛IllegalStateException—— InputStream 只能读一次
真正要对接外部 XML 接口,建议把这部分逻辑完全剥离出 Buffalo 的生命周期,用独立的 Servlet 或 Spring MVC Controller 承接,避免协议冲突和隐式耦合。










