Mule 4写入JSON到Oracle CLOB列报cannot create a clob错误咨询
问题场景
将Mule应用从3.9.5版本升级到4.4.1版本时,尝试将HTTP请求返回的JSON响应写入Oracle数据表的CLOB字段,触发如下报错:
cannot create a clob from a value of type 'class java.util.linkedhashmap'
添加DataWeave转换逻辑处理数据后仍然报相同错误,涉及的核心流程代码如下:
<http:request method="GET" config-ref="HTTP_Request_Configuration" path="${http.path}/{report_id}" doc:name="Request" doc:id="e596773f-d948-47fb-9cee-c23cf1a4dfdc" > <http:headers ><![CDATA[#[output application/java --- { "Authorization" : "Bearer " ++ vars.accessToken, "Accept" : "application/json" }]]]></http:headers> <http:uri-params ><![CDATA[#[output application/java --- { "report_id" : vars.expenseReportID }]]]></http:uri-params> </http:request> <ee:transform doc:name="Transform Message" doc:id="5d6cc3d7-0236-499a-9f93-1a2b2f331ae8"> <ee:message> <ee:set-payload><![CDATA[%dw 2.0 output application/java --- payload] ]></ee:set-payload> </ee:message> </ee:transform> <db:insert doc:name="DB_Insert" doc:id="09010c0a-7a89-4d9c-926f-eaf7ac36b9da" config-ref="Database_Config"> <db:sql>INSERT INTO stg_clientesalesforce (id_carga, contenido_json) VALUES (:id_carga, :contenido_json)</db:sql> <db:input-parameters><![CDATA[# [{"id_carga" : 12, "contenido_json": payload}]] ]></db:input-parameters> </db:insert>
报错根因
Mule 4的HTTP请求组件默认会将application/json类型的响应自动反序列化为Java的LinkedHashMap结构(即JSON对象对应的Java原生类型)。你配置的DataWeave转换输出格式为application/java,本质是直接将解析后的Map对象透传给数据库CLOB字段,Oracle驱动无法将Map结构直接转换为CLOB类型,因此持续抛出类型不匹配错误。
另外你贴出的代码中db:input-parameters里的Mule表达式# [存在多余空格,正确写法为#[,中间不能有空格,否则会额外触发表达式解析错误。
解决方法
核心逻辑是在传入CLOB字段前,将结构化的Map对象序列化为JSON格式的字符串,Mule数据库模块会自动将超长字符串转换为CLOB类型写入,无需手动创建CLOB对象,两种实现方式可选:
- 方式1:修改现有Transform组件的输出配置
将Transform组件的DataWeave逻辑替换为如下内容,直接输出序列化后的JSON字符串:%dw 2.0 output application/json --- payload - 方式2:直接在数据库插入入参处做转换,无需单独保留Transform组件
修改db:input-parameters部分的内容,使用write()函数将payload序列化为JSON字符串:<db:input-parameters><![CDATA[#[{ "id_carga" : 12, "contenido_json": write(payload, "application/json") }]]]></db:input-parameters>
内容的提问来源于stack exchange,提问作者hpandalai
相关产品推荐
相关产品推荐

