1

我正在使用带有 Hibernate 的 WLI SOA 应用程序。

我有以下课程:

class PersonDB implements Serializable {
    Integer id;
    String name;
    Date dob;
/** getters and setters **/
}

在 ModelPerson JPD 中,我进行了以下转换:

PersonDB personDB;
ModelDocument modelXML;
void transformModelXMLToPersonDBModel throws Exception {
    this.personDB = transformTransactioModel.transformModelXMLToPersonDBModel(this.modelXML);
}

在转换抽象类中,我进行了以下转换:

@com.bea.wli.transform.XQueryTransform(transformType = com.bea.wli.transform.XQueryTransform.TransformMethodType.XQUERY_REF, value = "transformModelXMLToPersonDBModel.xq", schemaValidate = @com.bea.wli.transform.XQueryTransform.SchemaValidate(returnValue = false, parameters = false))
public abstract PersonDB transformModelXMLToPersonDBModel(ModelDocument object);

而 xQuery transformModelXMLToPersonDBModel.xq 是:

declare namespace xf = "http://tempuri.org/Dominio/src/com/process/transformations/transformModelXMLToPersonDBModel/";
declare namespace ns-1 = "person.model.tempuri.com";

declare function xf:transformModelXMLToPersonDBModel($object as element(ns-1:Model)) as element() {
    for $o in $object return (
        <PersonDB>
        {
        for $code in $o/code
        return
            <id?>{ data($code) }</id>
        }
        {
        for $nameOfPerson in $o/nameOfPerson
        return 
            <name?>{ data($nameOfPerson)}</name>
        }
        {
        for $date in $o/date
        return
            <dob?>{ data($date) }</dob>
        }
    </PersonDB>
    )
};

declare variable $object as element(ns-1:Model) external;
xf:transformModelXMLToPersonDBModel($object)

后来,当我通过 SoapUI 测试操作时,我第一次尝试使用以下请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:pers="person.model.tempuri.com">
    <soapenv:Header/>
    <soapenv:Body>
    <open:find>
     <pers:Model>
        <!--Optional:-->
        <code>100</code>
        <!--Optional:-->
        <nameOfPerson>John</nameOfPerson>
        <!--Optional:-->
        <date>1985-11-23T12:44:07</date>
     </pers:Model>
   </open:find>
   </soapenv:Body>
</soapenv:Envelope>

这个回复没问题。

第二次,我测试以下请求以返回所有人员:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:pers="person.model.tempuri.com">
    <soapenv:Header/>
    <soapenv:Body>
      <open:find>
      <pers:Model>
      </pers:Model>
     </open:find>
   </soapenv:Body>
</soapenv:Envelope>

此响应在 SoapUI 响应中记录以下错误:

bea.wli.bpm.runtime.ProcessState.dispatchRequest(ProcessState.java:241) 在 com.bea.wli.bpm.runtime.JpdContainer.dispatchProcessRequest(JpdContainer.java:1077) 在 com.bea.wli.bpm.runtime。 JpdContainer.preInvoke(JpdContainer.java:1041) ... 29 更多原因:com.bea.transform.TransformException:转换中出现意外错误 - 请查看日志了解详细信息。在 com.bea.wli.transform.TransformExecutor.executeXQ2004(TransformExecutor.java:245) 在 com.bea.wli.transform.TransformExecutor.execute(TransformExecutor.java:94) 在 com.bea.wli.transform.runtime.DtfDispMethod .invoke(DtfDispMethod.java:393) 在 com.bea.wli.knex.runtime.core.container.Invocable.invoke(Invocable.java:503) 在 com.bea.wli.knex.runtime.core.container.Invocable .invoke(Invocable.java:476) 在 com.bea.wli.transform.runtime。

我认为问题是当我在 xQuery 中发送一个空的 $object 但我不知道如何验证此参数是否为空。

4

1 回答 1

0

这只是一个猜测,但您可以尝试更改类型以指示该元素是可选的。例如

declare function xf:transformModelXMLToPersonDBModel($object as element(ns-1:Model)?) as element()? {
  ....
};

declare variable $object as element(ns-1:Model)? external;
xf:transformModelXMLToPersonDBModel($object)

请注意,我添加了可选指示符“?” 在项目类型之后。

于 2014-02-13T21:27:34.603 回答