WSO2 Micro Integrator处理application/ld+json响应报错排查
问题根因
报错Unexpected character in preface '{' (code 123); expected '<'的触发逻辑非常明确:
- 你调用的后端接口返回的响应
Content-Type为application/ld+json - WSO2默认没有为该Content-Type绑定JSON解析器,框架默认用XML解析器处理响应体
- XML解析器读取内容时首先期望找到XML起始标记
<,但实际响应是JSON格式,首字符是{,直接抛出解析错误
你之前做的两个尝试都没命中问题核心:
- 移除
TRANSPORT_HEADERS会清空所有请求头,直接导致依赖特定请求头的后端接口鉴权/校验失败,本身就是不可行的方案 - 你配置的自定义消息构建器只匹配
application/json类型,完全没覆盖实际返回的application/ld+json,所以配置加了也没用
修复步骤
1. 补全消息构建器、格式化器配置
首先修改deployment.toml,新增application/ld+json对应的JSON构建器和格式化器配置,替换你之前加的单条builder配置:
# 消息构建器配置 [[custom_message_builders]] content_type = "application/json" class = "org.apache.synapse.commons.json.JsonStreamBuilder" [[custom_message_builders]] content_type = "application/ld+json" class = "org.apache.synapse.commons.json.JsonStreamBuilder" # 消息格式化器配置(必须加,否则返回响应时会报格式错误) [[custom_message_formatters]] content_type = "application/json" class = "org.apache.synapse.commons.json.JsonStreamFormatter" [[custom_message_formatters]] content_type = "application/ld+json" class = "org.apache.synapse.commons.json.JsonStreamFormatter"
如果你是直接修改axis2.xml配置文件,分别在<messageBuilders>和<messageFormatters>节点下新增对应条目即可:
<!-- messageBuilders节点内新增 --> <messageBuilder contentType="application/ld+json" class="org.apache.synapse.commons.json.JsonStreamBuilder"/> <!-- messageFormatters节点内新增 --> <messageFormatter contentType="application/ld+json" class="org.apache.synapse.commons.json.JsonStreamFormatter"/>
配置修改完成后必须重启集成服务,否则配置不会加载生效。
2. 可选API配置优化
你当前的API配置里outSequence为空,为了避免上下文残留的消息类型干扰解析,可以在<call>组件之前加一行属性配置,不会影响你需要透传的自定义业务请求头:
<property name="messageType" scope="axis2" action="remove"/>
配置完成后,框架会根据后端实际返回的Content-Type自动选择对应解析器,你脚本里的mc.getPayloadJSON()就能正常读取到JSON-LD的内容,后续判断逻辑会正常执行。
验证
服务重启后重新发起Postman请求,不会再出现XML解析报错,接口会按照脚本逻辑返回{"s":"success"}或者{"s":"fail"}的结果。
内容的提问来源于stack exchange,提问作者Ahmet Kalem
相关产品推荐
相关产品推荐

