xml을 받고 변환하고 WSO2 데이터 서비스로 전달하고 결과를 변환하여 요청자에게 돌려주는 WSO2 ESB에 프록시를 구축했습니다.DataService 결과를 변환하려고 할 때 NPE
결과 XML이 인쇄되므로 DataService가 올바르게 호출되고 있습니다.
<?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은 다음과 같습니다 :
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'?>
<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를 테스트 한 결과 tranformation이 작동합니다! =/
나는 GetAppointmentResponse
태그에 DSS에 의해 추가 된 인라인 네임 스페이스 때문에 발생할 수 있다고 생각합니다. 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
호출을의 웹 서비스가 제대로 호출되고 응답이 수신됩니다. PROXY2
를 호출
하지만, 로그 시퀀스는 다음과 같은 순서로 나타납니다 log2
는 log3
, log5
는 log4
그것은 PROXY2
이 PROXY3
에 대한 비동기 호출을 의미합니다. 답변을 soapUI로 반환하기 전에 응답의 XML을 기다리지 않습니다. 빈 몸체를 생성합니다.
그런 다음 동기화하는 방법은 무엇입니까? Call mediator로 Send 중재자를 대체하려고했지만 그 결과는 같습니다.
변환도 색슨 9.5와 함께 작동 - 단지 정보. –
변환이 코드 외부와 Saxon에서 작동하면 XSLT가 아닌 Java 코드의 잠재적 인 문제점을 알 수 있습니다. 그걸 보여줄 수 있어요? 오류 메시지는'GetAppointmentSchedulePortalReqCS_Response'와's11 : Body/child :: * [position() = 1] | s12 : Body/child :: * [position() = 1]', 어느 쪽도 우리에게 제공 한 코드의 어느 부분도 아닙니다. 이것들이 무엇을 말하는지 아십니까? – JLRishe
'GetAppointmentSchedulePortalReqCS_Response'은 설명 된 xsl 파일입니다. WSO2 ESB에서 실행되기 때문에 코드가 없습니다. – elias