【问题标题】:Oracle insert XML parameter is not validating in MuleOracle 插入 XML 参数在 Mule 中未验证
【发布时间】:2021-06-07 23:10:03
【问题描述】:

我在 Oracle XMLTYPE 列中有一个插入语句。当我在 Oracle 中运行它时,它工作正常。但是,如果我在 Mule 中插入相同的内容,则它不会验证。

我的 XML 是

'<DRIVEResponse><Loan><Condition ActionStep="parties. &amp;lt;A href=''ABC.com/abc/''"/> 
 </Loan>
 </DRIVEResponse>'

这是我在数据库插入中放置的内容

 {
'RESPONSE_XML' : '<DRIVEResponse><Loan><Condition ActionStep="parties. 
 &amp;lt;A href=''ABC.com/abc/''"/> </Loan></DRIVEResponse>' ,
 'SUCCESS_FLAG' : "Y"
 }

我收到的错误是

- Invalid input ''', expected `}` or ',' for the object expression.

(第 2 行,第 88 列):

查询文本来自 java 类。相同的查询文本正在发送到一个 Spring Boot 服务,并且插入正在那里进行。但是在骡子中我得到了如图所示的错误。如果我在 SQL 开发人员中运行这个查询,它的运行和插入记录。

更新:- 使用硬编码 XML 插入语句,工作正常。 但是,如果我将它放在一个转换中并将该变量带入查询中,它就会失败。即使我与硬编码值完全匹配,但如果我将它放在变量中,它会失败。

硬编码 - 工作正常

insert into xmlpkg.BLT_DV_REQ_RESP(ID, REQUEST_XML) values (
      xmlpkg.SEQ_DV_REQ_RESP.nextval, 
'<Condition  Code= "parties. &amp;lt;A 
 href=''h''&amp;gt;h/&amp;lt;/A&amp;gt;"></Condition>' )

取自变量 - 失败 下面的代码在我的转换中

 %dw 2.0
 output text/plain
 ---
 "'"++( '<Condition  Code= "parties. &amp;lt;A 
 href=\'\'h\'\'&amp;gt;h/preventfraud/&amp;lt;/A&amp;gt;"></Condition>' )  as 
 String ++ "'"

【问题讨论】:

  • 请阅读stackoverflow.com/help/how-to-ask 并提供了解问题以及如何重现所需的所有详细信息。例如,根本没有数据库或 Mule 应用程序的详细信息。在 Oracle 上运行时是什么意思?显示的 JSON 是什么?它与问题有关吗?它也应该在文本中。请使用文本而不是图像作为文本。有关原因的更多详细信息,请参阅meta.stackoverflow.com/questions/285551/…
  • 更新了我的问题。
  • "我收到错误,如图所示" - 错误消息在哪里?
  • 添加了我在 Studio 中看到的错误
  • 请在Mule中添加数据库操作

标签: mule dataweave


【解决方案1】:

RESPONSE_XML 的字符串转义不正确。您正试图将 XML 文档作为字符串表达式放入 DataWeave。但是,href= 之后的引号不平衡和/或错误地转义。我不确定原始 XML 文档是什么。如果这是手动操作,最好让 DataWeave 自动正确地转义它,例如使用 write(xmlPayload, "application/xml") as String 之类的东西。

例子:

        <ee:transform doc:name="Mock result from a request" doc:id="723fdd83-fcce-4bff-8a24-065609b235b0" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/xml
---
{
    book: {
            name: "Robin Hood"
    }   
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <ee:transform doc:name="Do some transform" doc:id="aaca98c2-1f76-476f-8ab3-030061e46472" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload.book mapObject (title: $) ]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <ee:transform doc:name="Prepare arguments for db operation" doc:id="261e8437-d7b5-4a8e-b781-5790ea5f9f40" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
    'RESPONSE_XML' : write(payload, "application/xml") ,
    'SUCCESS_FLAG' : "Y"
}
]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <logger level="INFO" doc:name="Logger" doc:id="a90fca6e-5fd3-4aaa-963c-0f06376e4076" message="output #[payload]"/>

【讨论】:

  • @aled--> 尽管 XML 看起来有不平衡的引号,但 XML 仍然有效(如果您在此处查看 -->liquid-technologies.com/online-xml-validator)。假设这个 XML 是从外部服务返回的,而这个响应我们打算在经过一些转换后将它传递给 DB 中的存储过程。我们该怎么做呢?请让我知道您对此的看法。
  • 我正在添加一个模拟值的示例,只是为了显示该方法。您可以使用变量而不是有效负载。
  • XML 可能由其自身形成。问题在于它使用的字符与 DataWeave 用于分隔字符串的字符相同。导致错误的是同一表达式中两者的组合。
  • 我认为你所说的在这里说得通。我用硬编码的 XML 更新了我的问题。当我对 XML 进行硬编码时,它的插入成功。如果我在转换中创建该字符串并在插入语句中引用该变量,它会失败。
  • 尝试在两种语言之间进行双重转义很难,而且结果难以阅读,但这并非不可能。示例:read("&lt;DRIVEResponse&gt;&lt;Loan&gt;&lt;Condition ActionStep=\"parties. &amp;amp;lt;A href=''ABC.com/abc/''\"/&gt; &lt;/Loan&gt;&lt;/DRIVEResponse&gt;", "application/xml")。我认为这不值得付出努力,最好让 DataWeave 来做,通过生成它或从文件中读取而不是硬编码。我使用 read() 来确认 DataWeave 可以解析它。
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 2022-01-09
  • 1970-01-01
  • 2013-11-21
  • 2021-12-28
  • 2019-04-21
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多