WLI-преобразование нулевого узла xQuery

Я использую приложение WLI SOA с Hibernate.

У меня есть следующий класс:

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

В JPD ModelPerson у меня есть следующее преобразование:

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

В абстрактном классе Transform у меня есть следующая трансформация:

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

fc: JWSError Необработанное исключение процесса com.bea.wli.bpm.runtime.UnhandledProcessException: Необработанное исключение процесса [ServiceException] в com.bea.wli.bpm.runtime.JpdContainer.preInvoke(JpdContainer.java:1043) в com.bea.wli.knex.runtime.core.container.Invocable.invoke(Invocable.java:248) в com.bea.wli.bpm.runtime.JpdContainer.invoke(JpdContainer.java:814) в com.bea.wli.knex.runtime.core.bean.BaseContainerBean.invokeBase(BaseContainerBean.java:224) в com.bea.wli.knex.runtime.core.bean.SLSBContainerBean.invoke(SLSBContainerBean.java:136) в com.bea.homp invoke (StatelessContainer_2hozgx_ELOImpl.java:137) на com.bea.wlwgen.SLSBContAdpt.invokeOnBean(SLSBContAdpt.java:29) на com.bea.wli.knex.runtime.core.bean.BaseDispatcherAsjBean.Bean.Bean в com.bea.wli.knex.runtime.core.bean.BaseDispatcherBean.invoke(BaseDispatcherBean.java:54) в com.bea.wli.knex.runtime.core.bean.SyncDispatcherBean.invoke(SyncDispatcherBean)j:: в com.bea.wli.knex.runtime.core.bean.SyncDispatcher_k1mrl8_EOImpl.invoke(SyncDispatcher_k1mrl8_EOImpl.java:133) в com.bea.wli.knex.runtime.core.dispatrem16patch на com.bea.wli.knex.runtime.core.dispatcher.Dispatcher.dispatch(Dispatcher.java:49) на com.bea.wli.knex.runtime.core.dispatcher.HttpServerHelper.executePostRequest(HttpServerHelperjava). в com.bea.wli.knex.runtime.core.dispatcher.HttpServer.doPost(HttpServer.java:33) в com.bea.wli.bpm.runtime.JpdServlet.doPost(JpdServlet.java:253) в javax.serv.http.HttpServlet.service(HttpServlet.java:763) по адресу javax.servlet.http.HttpServlet.service(HttpServlet.java:856) по адресу weblogic.servlet.internal.StubSecurityHelper$ServletServiceSecure weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) по адресу weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) по адресу weblogic.servlet.internal.Serv.Serv. letStubImpl.java:175) по адресу weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3231) по адресу weblogic.security.acl.internal.AuthenticatedSubject.doAs1ject.loj.SecurityManager.internal.ServletRequestImpl.run(ServletRequestImpl.java:1362) в weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) в weblogic.work.ExecuteThread.run(ExecuteThread.java:181), вызванный: com.bea.bpm.runtime.UnhandledProcessException: необработанное исключение процесса в com.bea.wli.bpm.runtime.Activity.processException(Activity.java:380) в com.bea.wli.bpm.runtime.OnException.rethrow(OnException.java:101) на com.bea.wli.bpm.runtime.OnException.execute(OnException.java:198) на com.bea.wli.bpm.runtime.SyncReceive.messageDelivery(SyncReceive.java:63) в com.bea.wli.bpm.runtime.ProcessState.processMessage(ProcessState.java:217) в com.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.prejvoer () 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.DMdpis.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.DtfHandler.invoke(DtfHandler.java:112) по адресу com.process.transformations.TransaformTransactionModelImpl.transformModelXMLToPersonDlform.lmp.ImpL.ImpLo.ImpLo.ImpLo.Imploader.ImpMaction process.ModeloPerson.transformModelXMLToPersonDBModel(ModeloPerson.java:163) в sun.reflect.NativeMethodAccessorImpl.invoke0(родной метод) в sun.reflect.NativeMethodAccessorImpl. Java:25) на java.lang.reflect.Method.invoke(Method.java:585) на com.bea.wli.bpm.runtime.Perform.invoke(Perform.java:39) в com.bea.wli.bpm.runtime.Perform.execute(Perform.java:50) ... еще 34 причины: java.lang.NullPointerException в com.bea.wli.xquery.marshall.xq2004.ClassUnmarshaller.isFullNode(ClassUnmarshaller.java:225) на com.bea.wli.xquery.marshall.xq2004.ClassUnmarshaller.unmarshall(ClassUnmarshaller.javaquaw at at.marshall.xq2004.PlanUnmarshaller.unmarshall(PlanUnmarshaller.java:13) в com.bea.wli.transform.TransformExecutor.executeXQ2004(TransformExecutor.java:231) ... еще 47

Я думаю, что проблема в том, что я отправляю пустой объект $ в xQuery, но я не знаю, как проверить этот параметр, если он равен нулю.

1 ответ

Это всего лишь предположение, но вы можете попробовать изменить ваши типы, чтобы указать, что элемент является необязательным. например

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

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

Обратите внимание, что я добавил дополнительный индикатор "?" после типов предметов.

Другие вопросы по тегам