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);
}

Transform Abstract Class には、次の変換があります。

@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>

この対応はOKです。

2 回目は、次のリクエストをテストして、すべての人を返します。

<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 com.bea.wli.transform.runtime の .invoke(Invocable.java:476)。

問題は、xQuery で空の $object を送信したときだと思いますが、null の場合にこのパラメーターを検証する方法がわかりません。

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 に答える