我有一个应该应用于flowVar输入的dataweave函数。输入应该是JSON。使用示例数据和预览,一切正常,但在实际执行时,我得到一个错误,我试图将该函数应用于二进制文件。 flowVar的内容是另一个dataweave转换的输出。我设置flowVar时的有效负载是com.mulesoft.weave.reader.ByteArraySeekableStream类型。如何将其转换为DataWeave可以使用的东西?
这是给出问题的功能:
%var theAttributes = flowVars.attributes
%function supervisorAttribute(id) (theAttributes[?$.id ~=id].attributes[0][?($ == "INDP" or $ == "THES" or $ == "UROP")][0])
错误是:
Type mismatch for 'Value Selector' operator
found :binary, :name
required :datetime, :name or
required :localdatetime, :name or
required :object, :name or
required :time, :name or
required :array, :name or
...
我尝试添加一个Object To Json变换器,但得到了这个:
No serializer found for class com.mulesoft.weave.reader.ByteArraySeekableStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (org.codehaus.jackson.map.JsonMappingException). (org.mule.api.transformer.TransformerMessagingException).
我尝试将一个Byte数组添加到Object Transformer,一个Byte数组添加到Object Transformer,后跟一个Object to JSON Transformer,并将flowVar设置为#[message.payloadAs(java.lang.String)],但是得到了这个每个案例:
Type mismatch for 'Filter Selector ([?()])' operator
found :string, :function
required :array, :function
这是可以作为预览输入正常工作的示例JSON数据:
[
{
"id": "111",
"attributes": [
"THES",
"VARU",
"ROTC",
"CIH",
"HH"
]
},
{
"id": "222",
"attributes": [
"VARU",
"BIOL",
"HA2",
"FSEM"
]
},
{
"id": "2",
"attributes": [
"ROTC"
]
}
]
这是创建JSON的转换:
%dw 1.0
%output application/json
---
payload groupBy $.SUBJECT_VERSION_ID map {
id: $[0].SUBJECT_VERSION_ID,
attributes: $.ATTRIBUTE_CODE
}
转型本身似乎运作良好。如果我将输出作为响应返回,则结果如此。
[
{
"id": "35DE521C7A772317E053282701126511",
"attributes": [
"CAL1",
"CON"
]
},
{
"id": "35DE521C7A6C2317E053282701126511",
"attributes": [
"REST"
]
},
{
"id": "35DE521C7A692317E053282701126511",
"attributes": [
"SUPR"
]
}
]
这里有完整的流程:
<flow name="subjects-feedFlow">
<db:select config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[select subject_version_id, attribute_code from subject_version_attribute]]></db:parameterized-query>
</db:select>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
payload groupBy $.SUBJECT_VERSION_ID map {
id: $[0].SUBJECT_VERSION_ID,
attributes: $.ATTRIBUTE_CODE
} ]]></dw:set-payload>
</dw:transform-message>
<set-variable variableName="attributes" value="#[payload]"/>
<db:select config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[select c.subject_container_id,
subject_level, variable_units, lecture_units, lab_units, subject_version_id
from subject_container c, subject_version v
where c.subject_container_id = v.subject_container_id
and v.effective_from_term = (select max(effective_from_term) from subject_version where v.subject_container_id = subject_container_id)]]></db:parameterized-query>
</db:select>
<dw:transform-message>
<dw:input-payload/>
<dw:input-variable variableName="attributes"/>
<dw:set-payload><![CDATA[%dw 1.0
%output application/dw
%var theAttributes = flowVars.attributes
%function supervisorAttribute(id) (theAttributes[?$.id ~=id].attributes[0][?($ == "INDP" or $ == "THES" or $ == "UROP")][0])
---
{
subjects: {
(payload map ((payload01 , indexOfPayload01) -> {
subject @(containerId: payload01.SUBJECT_CONTAINER_ID as :string, versionNum: payload01.VERSION_NUM): {
units: {
(unitType: "FIXED") when payload01.VARIABLE_UNITS=='N',
(unitType: "ARRANGED") when payload01.VARIABLE_UNITS=='Y',
(lectureUnits: payload01.LECTURE_UNITS as :string) when payload01.VARIABLE_UNITS=='N',
(labUnits: payload01.LAB_UNITS as :string) when payload01.VARIABLE_UNITS=='N',
(prepUnits: payload01.PREP_UNITS as :string) when payload01.VARIABLE_UNITS=='N'
},
(supervisorAttribute: supervisorAttribute(payload01.SUBJECT_VERSION_ID)) when supervisorAttribute(payload01.SUBJECT_VERSION_ID) != null,
}
}
}]]></dw:set-payload>
</dw:transform-message>
</flow>