Я создал прокси-сервер в WSO2 ESB, который получает XML-код, преобразует его, передает в службу данных WSO2, преобразует результат и возвращает его реквестеру.NPE при попытке преобразовать результат DataService
Согласно журналу, DataService правильно вызывается, поскольку XML-результат выводится. Проблема на преобразующей результата, где это происходит:
ERROR - XSLTMediator Unable to perform XSLT transformation using : Value {name ='null', keyValue ='GetAppointmentSchedulePortalReqCS_Response'} against source XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1]
java.lang.NullPointerException
at org.apache.synapse.util.jaxp.StreamSourceBuilder.getSource(StreamSourceBuilder.java:55)
at org.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:289)
at org.apache.synapse.mediators.transform.XSLTMediator.mediate(XSLTMediator.java:191)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:230)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:443)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:166)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:217)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Файл XLST является:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://ws.wso2.org/dataservice" version="2.0"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xpath-default-namespace="http://www.algartelecom.com.br/SOA/Service/GetAppointmentSchedulePortalReqCS">
<xsl:output method="xml" indent="yes" />
<xsl:template match="//xs:GetAppointmentResponse">
<AppointmentRequest>
<serviceOrderID>
<xsl:value-of select="xs:NewAppointment" />
</serviceOrderID>
<opportunityID>
<xsl:value-of select="xs:ServiceTOA" />
</opportunityID>
<customerOrderID>
<xsl:value-of select="xs:MinimalTime" />
</customerOrderID>
</AppointmentRequest>
</xsl:template>
</xsl:transform>
И XML, возвращаемый DataService является:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<GetAppointmentResponse xmlns="http://ws.wso2.org/dataservice">
<NewAppointment>147</NewAppointment>
<ServiceTOA>TT_P</ServiceTOA>
<MinimalTime>1</MinimalTime>
<ReturnCode>0</ReturnCode>
<ErrorMessage>SUCESSO</ErrorMessage>
</GetAppointmentResponse>
</soapenv:Body>
</soapenv:Envelope>
Я ve проверил XSLT с XML в других инструментах и работает tranformation! =/
Я думаю, что это может быть вызвано встроенным пространством имен, добавленным DSS в тег GetAppointmentResponse
. Использование JRE1.6.0_43, ESB 4.6.0 и DSS 3.1.0. Пожалуйста помоги.
EDIT
Я заметил, что эта проблема действительно вызвана пустым телом в ответ, как уже упоминалось @Kallja.
Резюмируя, у меня есть следующий сценарий:
PROXY1 -> PROXY2 -> PROXY3 -> ENDPOINT
in xslt->log1->header->send log2->header->send xslt->log3 address web service
out log6->xslt->send log5->send xslt->log4->send
Calling непосредственно PROXY3
через SoapUI, то вебсервис правильно называется и будет получен ответ.
Но, называя PROXY2
последовательность журнала появится в следующем порядке: log2
, log3
, log5
, log4
Это означает, что PROXY2
делает асинхронный вызов к PROXY3
. Он не дожидается XML ответа до того, как вернется в soapUI ответ. Он генерирует пустое тело.
Затем, как сделать его синхронным? Я попытался заменить посредника Send посредником Callout, но результат тот же.
Трансформации работает с Saxon 9.5 тоже - только для информации. –
Если трансформация работает вне вашего кода и в саксоне, это говорит о потенциальной проблеме с вашим Java-кодом, а не с XSLT. Вы можете нам это показать? Сообщение об ошибке относится к 'GetAppointmentSchedulePortalReqCS_Response' и' s11: Body/child :: * [position() = 1] | s12: Тело/ребенок :: * [position() = 1] ', ни один из которых нигде в коде, который вы нам предоставили. Вы знаете, на что они могут ссылаться? – JLRishe
'GetAppointmentSchedulePortalReqCS_Response' - это описанный файл xsl. Нет кода, поскольку он работает на WSO2 ESB. – elias