WSO2 Micro Integrator dateTime与STRING类型不匹配错误排查求助
问题:WSO2 Micro Integrator数据服务日期类型不匹配错误
问题场景
使用WSO2 Micro Integrator的Data Service向数据库保存数据时,通过Payload Factory构造请求传递参数,触发了日期类型不匹配的错误。
相关配置
1. Payload Factory配置
<payloadFactory media-type="json"> <format> { "_postauthor": { "id": "$1", "name": "$2", "birth_date": "$3" } } </format> <args> <arg evaluator="json" expression="$.id"/> <arg evaluator="xml" expression="get-property('name')"/> <arg evaluator="json" expression="$.birth_date"/> </args> </payloadFactory> <property name="messageType" value="application/json" scope="axis2"/>
2. 数据服务定义
<data name="RESTDataService" transports="http https"> <description>AdastraApp REST Data service </description> <config id="AdastraAppDataSource"> ... </config> <resource method="POST" path="author"> <description /> <call-query href="CreateAuthor"> <with-param name="id" query-param="id" /> <with-param name="name" query-param="name" /> <with-param name="birth_date" query-param="birth_date" /> </call-query> </resource> <query id="CreateAuthor" useConfig="AdastraAppDataSource"> <sql>INSERT INTO authors (id, name, birth_date) VALUES (:id, :name, CAST(:birth_date AS DATETIME))</sql> <param type="IN" name="id" optional="false" paramType="SCALAR" sqlType="STRING" defaultValue="NULL" /> <param type="IN" name="name" optional="true" paramType="SCALAR" sqlType="STRING" defaultValue="NULL" /> <param type="IN" name="birth_date" optional="true" paramType="SCALAR" sqlType="TIMESTAMP" defaultValue="NULL" /> </query> </data>
3. 请求负载
{ "_postauthor": { "id": "001482af-b42f-41b8-884d-6109954d81f9", "name": "Madeline Miller", "birth_date": "1978-01-01T00:00:00.000Z" } }
错误日志
[2025-02-05 03:15:09,478] ERROR {GsonXMLStreamReader} - Value type miss match, Expected value type - 'dateTime', but found - 'STRING' [2025-02-05 03:15:09,478] ERROR {ServerWorker} - Error processing POST request for : /services/RESTDataService/author. java.lang.IllegalArgumentException: Value type miss match, Expected value type - 'dateTime', but found - 'STRING' at org.apache.axis2.json.gson.GsonXMLStreamReader.nextValue(GsonXMLStreamReader.java:750) at org.apache.axis2.json.gson.GsonXMLStreamReader.readValue(GsonXMLStreamReader.java:625) at org.apache.axis2.json.gson.GsonXMLStreamReader.stateTransition(GsonXMLStreamReader.java:531) at org.apache.axis2.json.gson.GsonXMLStreamReader.next(GsonXMLStreamReader.java:177) at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681) at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214) at org.apache.axiom.om.impl.llom.OMSerializableImpl.build(OMSerializableImpl.java:78)
问题原因
数据服务中birth_date参数定义为sqlType="TIMESTAMP",但Payload Factory构造的JSON请求里,birth_date被双引号包裹为字符串类型,WSO2的JSON解析器(GsonXMLStreamReader)无法自动将字符串转换为dateTime/TIMESTAMP类型,触发类型不匹配错误。
解决方案
方案1:修改Payload Factory,传递无引号的日期值
去掉Payload Factory格式中birth_date值的双引号,让JSON解析器自动识别为日期类型:
<payloadFactory media-type="json"> <format> { "_postauthor": { "id": "$1", "name": "$2", "birth_date": $3 } } </format> <args> <arg evaluator="json" expression="$.id"/> <arg evaluator="xml" expression="get-property('name')"/> <arg evaluator="json" expression="$.birth_date"/> </args> </payloadFactory> <property name="messageType" value="application/json" scope="axis2"/>
注意:确保传入的birth_date是符合ISO 8601标准的日期字符串(如1978-01-01T00:00:00.000Z)。
方案2:修改数据服务参数类型
将数据服务中birth_date的sqlType改为STRING,通过SQL的CAST转换处理日期:
<param type="IN" name="birth_date" optional="true" paramType="SCALAR" sqlType="STRING" defaultValue="NULL" />
内容的提问来源于stack exchange,提问作者Pospi
相关产品推荐
相关产品推荐

