使用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
相关产品推荐
相关产品推荐

