我在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>
而且通過的DataService返回的XML是:
<?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>
我在另一個工具中測試了帶有XML的XSLT,並且轉換工作正常! =/
我在想這可能是由DSS添加到GetAppointmentResponse
標記中的內聯命名空間引起的。 使用JRE1.6.0_43,ESB 4.6.0和DSS 3.1.0。請幫忙。
編輯
我注意到,這個問題是由一個空體在應對真正引起的,如@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
通過的soapUI直接PROXY3
調用,web服務正確調用並接收響應。
但是,調用PROXY2
,日誌序列出現在以下順序:log2
,log3
,log5
,log4
這意味着PROXY2
正在爲PROXY3
的異步調用。它不會在返回soapUI之前等待響應的XML。它產生一個空的身體。
那麼,如何讓它同步呢?我試着用Callout中介替換Send中介,但結果是一樣的。
改造工程與撒克遜9.5太 - 只爲信息。 –
如果轉換在您的代碼和撒克遜以外的地方工作,那麼這意味着您的Java代碼而不是XSLT的潛在問題。你能告訴我們嗎?錯誤消息引用'GetAppointmentSchedulePortalReqCS_Response'和's11:Body/child :: * [position()= 1] | s12:身體/孩子:: * [位置()= 1]',這兩者都不是您提供給我們的代碼中的任何地方。你知道這些可能是指什麼嗎? – JLRishe
'GetAppointmentSchedulePortalReqCS_Response'是描述的xsl文件。沒有代碼,因爲它運行在WSO2 ESB上。 – elias