You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WSO2 JsonTransform Mediator遇空值抛出JsonNull UnsupportedOperationException

问题:JsonTransform Mediator处理空手机号字段时抛出JsonNull异常

场景描述

在序列中使用JsonTransform Mediator,确保数据库查询返回的手机号字段以字符串而非数字类型返回,配置如下:

JsonTransform Mediator配置

<jsontransform description="JSON Transform" schema="conf:custom/mySchema.json">

对应的JSON Schema

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "nodes": {
      "type": "object",
      "properties": {
        "node": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "phone": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}

问题现象

当phone字段不为空时,中介器运行正常;但字段为空时,抛出以下异常:

JsonNull java.lang.UnsupportedOperationException: JsonNull
    at com.google.gson.JsonElement.getAsString(JsonElement.java:192)
    at org.apache.synapse.commons.json.jsonprocessor.validators.ObjectValidator.validateAndUpdateEntriesMap(ObjectValidator.java:349)

已尝试添加以下属性但未解决问题:

<property name="synapse.commons.enableXmlNullForEmptyElement" value="false"/>
<property name="synapse.commons.json.output.autoPrimitive" value="true"/>

需求:无需自定义中介的解决方案。


解决方案

1. 修改JSON Schema允许空值类型

在phone字段的schema定义中,将类型改为数组同时包含string和null,明确允许该字段为空,避免中介器强制转换空值为字符串时抛出异常:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "nodes": {
      "type": "object",
      "properties": {
        "node": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "phone": {
                "type": ["string", "null"]
              }
            }
          }
        }
      }
    }
  }
}

2. 添加Synapse空值转换属性

添加以下属性,强制将输入中的null值转换为空字符串,让JsonTransform Mediator识别为字符串类型的空值:

<property name="synapse.commons.json.input.convert.null" value="true"/>

该属性会把输入JSON中的null替换成空字符串,避免触发JsonElement.getAsString()的异常。

3. 调整数据库查询返回值

修改数据库查询语句,将空的手机号字段默认返回空字符串而非null,从源头上消除JsonNull的产生。例如SQL中使用:

SELECT COALESCE(phone, '') AS phone FROM your_table;

内容的提问来源于stack exchange,提问作者Vinnie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:06:23